ตรวจสอบว่าสตริงมีตัวเลข Java หรือไม่


102

ฉันกำลังเขียนโปรแกรมที่ผู้ใช้ป้อน String ในรูปแบบต่อไปนี้:

"What is the square of 10?"
  1. ฉันต้องการตรวจสอบว่ามีตัวเลขอยู่ในสตริง
  2. จากนั้นแยกเฉพาะตัวเลข
  3. ถ้าฉันใช้.contains("\\d+")หรือ.contains("[0-9]+")โปรแกรมไม่พบตัวเลขใน String ไม่ว่าอินพุตจะเป็นอะไรก็ตาม แต่.matches("\\d+")จะใช้ได้เฉพาะเมื่อมีตัวเลขเท่านั้น

ฉันจะใช้อะไรเป็นโซลูชันในการค้นหาและแยกข้อมูลได้


หากคุณต้องการแยกตัวเลขแรกไม่ใช่แค่ตัวเลขจากสตริงอินพุตโปรดดูคำตอบของฉัน
Sajal Dutta

คำตอบ:


230

ลองดู

str.matches(".*\\d.*");

2
แบ็กสแลชคู่ทำอะไร?
ankit

15
เพื่ออธิบาย:. * หมายถึงอักขระใด ๆ ตั้งแต่ 0 ถึงการเกิดขึ้นไม่สิ้นสุดมากกว่า \\ d + (แบ็กสแลชคู่ฉันคิดว่าเป็นเพียงการหลีกหนีเครื่องหมายแบ็กสแลชที่สอง) และ \ d + หมายถึงตัวเลขตั้งแต่ 1 ครั้งถึงไม่มีที่สิ้นสุด
Giudark

6
ไม่ใช่เวทมนตร์ของมนุษย์ต่างดาวเป็น BS ที่เป็นความลับย้อนกลับไปตั้งแต่สมัยที่ไม่มีใครสามารถทำสิ่งนี้ได้ แต่วิศวกรที่คิดค้นมันขึ้นมาเพราะมันเป็นรหัสลับที่มีเพียงผู้สร้างเท่านั้นที่รู้จนกว่าพวกเขาจะแบ่งปัน
JamisonMan111

แก้ไขเนื่องจากถ้ามีเพียงตัวเลขเดียวการแก้ปัญหาก็เพียงพอแล้วไม่จำเป็นต้องมี 1 หลักขึ้นไปในกรณีนี้
Yassin Hajaj

26

หากคุณต้องการแยกตัวเลขแรกออกจากสตริงอินพุตคุณสามารถทำได้ -

public static String extractNumber(final String str) {                
    
    if(str == null || str.isEmpty()) return "";
    
    StringBuilder sb = new StringBuilder();
    boolean found = false;
    for(char c : str.toCharArray()){
        if(Character.isDigit(c)){
            sb.append(c);
            found = true;
        } else if(found){
            // If we already found a digit before and this char is not a digit, stop looping
            break;                
        }
    }
    
    return sb.toString();
}

ตัวอย่าง:

สำหรับอินพุต "123abc" วิธีการด้านบนจะส่งกลับ 123

สำหรับ "abc1000def", 1000

สำหรับ "555abc45" 555.

สำหรับ "abc" จะส่งคืนสตริงว่าง


11

ฉันคิดว่ามันเร็วกว่า regex

public final boolean containsDigit(String s) {
    boolean containsDigit = false;

    if (s != null && !s.isEmpty()) {
        for (char c : s.toCharArray()) {
            if (containsDigit = Character.isDigit(c)) {
                break;
            }
        }
    }

    return containsDigit;
}

ขออภัยฉันไม่เห็นการแยกหากคุณต้องการแยกตัวเลขในสตริงคุณสามารถแก้ไขรหัสนี้ได้อย่างง่ายดาย
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") แทนที่ตัวอักษรทั้งหมด

s=s.replaceAll("[*0-9]", "") แทนที่ตัวเลขทั้งหมด

หากคุณทำสองสิ่งแทนที่คุณจะได้รับสตริงอักขระพิเศษทั้งหมด

หากคุณต้องการแยกเฉพาะจำนวนเต็มจากไฟล์ String s=s.replaceAll("[^0-9]", "")

หากคุณต้องการแยกเฉพาะ Alphabets จากไฟล์ String s=s.replaceAll("[^a-zA-Z]", "")

มีความสุขในการเขียนโค้ด :)


10

ฉันไม่พบรูปแบบเดียวที่ถูกต้อง โปรดปฏิบัติตามคำแนะนำด้านล่างสำหรับวิธีแก้ปัญหาเล็กน้อยและหวาน

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();

นี่ใช้งานได้ดีจริงๆ สิ่งเดียวที่คุณต้องระวังคือถ้าสตริงมีเครื่องหมายทับ ถ้าเป็นเช่นนั้นฉันคิดว่าสิ่งนี้จะทำให้เกิดข้อผิดพลาด "อักขระหลีกที่ผิดกฎหมาย"
w3bshark

นี่คือสิ่งที่ดีที่สุด
Yashwin Munsadwala

9

โค้ดด้านล่างนี้เพียงพอสำหรับ "ตรวจสอบว่าสตริงมีตัวเลขใน Java หรือไม่"

Pattern p = Pattern.compile("([0-9])");
Matcher m = p.matcher("Here is ur string");

if(m.find()){
    System.out.println("Hello "+m.find());
}

8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);

3
บรรทัดแรกมีข้อผิดพลาดเล็กน้อยวงเล็บขาดหายไปใน String รูปแบบ p = Pattern.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi

ยังไม่ได้ผล ... การทดสอบใช้งานได้ แต่ 123TEST ไม่ทำงาน
fergal_dd

7

ลองใช้รูปแบบต่อไปนี้:

.matches("[a-zA-Z ]*\\d+.*")

อย่างไรก็ตามหากผู้ใช้สุภาพและบอกว่า"please"สิ่งนี้จะล้มเหลว แถมในตัวอย่างของ OP ยังมีเครื่องหมาย "?" เพื่อบัญชี
christopher

1
แน่ใจหรือว่าแก้ไขแล้ว
christopher

นิพจน์นี้ใช้ไม่ได้กับคำตอบเช่น"10"ตัวอย่าง
fabdouglas

6

วิธีแก้ปัญหาที่ฉันใช้มีลักษณะดังนี้:

Pattern numberPat = Pattern.compile("\\d+");
Matcher matcher1 = numberPat.matcher(line);

Pattern stringPat = Pattern.compile("What is the square of", Pattern.CASE_INSENSITIVE);
Matcher matcher2 = stringPat.matcher(line);

if (matcher1.find() && matcher2.find())
{
    int number = Integer.parseInt(matcher1.group());                    
    pw.println(number + " squared = " + (number * number));
}

ฉันแน่ใจว่ามันไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่เหมาะกับความต้องการของฉัน ขอบคุณทุกท่านสำหรับความช่วยเหลือ :)



1

เนื่องจากคุณไม่เพียงต้องการค้นหาตัวเลขเท่านั้น แต่ยังแยกมันออกไปด้วยคุณควรเขียนฟังก์ชันเล็ก ๆ ที่ทำเพื่อคุณ ไปทีละตัวอักษรจนกว่าคุณจะเห็นตัวเลข อ่าเพิ่งพบโค้ดที่จำเป็นสำหรับคุณใน StackOverflow: หาจำนวนเต็มในสตริง ดูคำตอบที่ยอมรับ


1
public String hasNums(String str) {
        char[] nums = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] toChar = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            toChar[i] = str.charAt(i);
            for (int j = 0; j < nums.length; j++) {
                if (toChar[i] == nums[j]) { return str; }
            }
        }
        return "None";
    }

1

.matches(".*\\d+.*")ใช้ได้กับตัวเลขเท่านั้น แต่ไม่ใช่สัญลักษณ์อื่น ๆ เช่น//หรือ*อื่น ๆ


0

ASCII เป็นจุดเริ่มต้นของ UNICODE ดังนั้นคุณสามารถทำสิ่งนี้ได้:

(x >= 97 && x <= 122) || (x >= 65 && x <= 90) // 97 == 'a' and 65 = 'A'

ฉันแน่ใจว่าคุณสามารถหาค่าอื่น ๆ ได้ ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.