Kiểm tra xem một Chuỗi có chứa các số Java không


102

Tôi đang viết một chương trình trong đó người dùng nhập một Chuỗi theo định dạng sau:

"What is the square of 10?"
  1. Tôi cần kiểm tra xem có một số trong chuỗi
  2. và sau đó chỉ trích xuất số.
  3. Nếu tôi sử dụng .contains("\\d+")hoặc .contains("[0-9]+"), chương trình không thể tìm thấy một số trong Chuỗi, bất kể đầu vào là gì, nhưng .matches("\\d+")sẽ chỉ hoạt động khi chỉ có số.

Tôi có thể sử dụng gì làm giải pháp cho việc tìm kiếm và giải nén?


Nếu bạn muốn trích xuất số đầu tiên, không chỉ là chữ số từ chuỗi đầu vào, hãy xem câu trả lời của tôi.
Sajal Dutta

Câu trả lời:


229

thử cái này

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

2
Dấu gạch chéo ngược kép làm gì?
ankit

15
Để giải thích:. * Có nghĩa là bất kỳ ký tự nào từ 0 đến vô hạn, hơn là \\ d + (dấu gạch chéo ngược kép mà tôi nghĩ là để thoát khỏi dấu gạch chéo ngược thứ hai) và \ d + có nghĩa là một chữ số từ 1 lần đến vô hạn.
Giudark

6
Đó không phải là phép thuật của người ngoài hành tinh mà là BS bí ẩn, từ những ngày không ai có thể làm được thứ này mà là những kỹ sư đã phát minh ra nó vì về cơ bản nó là một mã bí mật mà chỉ những người sáng tạo mới biết cho đến khi họ chia sẻ nó.
JamisonMan111

Sửa đổi, bởi vì nếu chỉ có một chữ số thì lời giải là đủ tốt, không cần phải có 1 hoặc nhiều chữ số trong trường hợp này.
Yassin Hajaj

26

Nếu bạn muốn trích xuất số đầu tiên ra khỏi chuỗi đầu vào, bạn có thể thực hiện-

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();
}

Ví dụ:

Đối với đầu vào "123abc", phương thức trên sẽ trả về 123.

Đối với "abc1000def", 1000.

Đối với "555abc45", 555.

Đối với "abc", sẽ trả về một chuỗi trống.


11

Tôi nghĩ nó nhanh hơn 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;
}

Rất tiếc, tôi không thấy giải nén. Nếu bạn muốn trích xuất số trong chuỗi, bạn có thể dễ dàng chỉnh sửa mã này.
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") thay thế tất cả các bảng chữ cái

s=s.replaceAll("[*0-9]", "") thay thế tất cả các số

nếu bạn làm ở trên hai lần thay thế bạn sẽ nhận được tất cả các chuỗi ký tự đặc biệt

Nếu bạn chỉ muốn trích xuất số nguyên từ String s=s.replaceAll("[^0-9]", "")

Nếu bạn chỉ muốn trích xuất Bảng chữ cái từ String s=s.replaceAll("[^a-zA-Z]", "")

Chúc bạn viết mã vui vẻ :)


10

Tôi không thể tìm thấy một mẫu chính xác. Hãy làm theo hướng dẫn dưới đây để có một giải pháp nhỏ và ngọt ngào.

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

Điều này thực sự hoạt động tốt. Điều duy nhất bạn cần chú ý là nếu chuỗi có dấu gạch chéo ngược. Nếu có, thì tôi nghĩ điều này sẽ tạo ra lỗi "nhân vật trốn thoát bất hợp pháp".
w3bshark

đây là điều tốt nhất
Yashwin Munsadwala

9

Đoạn mã dưới đây là đủ để "Kiểm tra xem một chuỗi có chứa số trong Java hay không"

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
Dòng đầu tiên có lỗi nhỏ, thiếu dấu ngoặc trong Chuỗi. Mẫu p = Pattern.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi

Ngoài ra, điều này không hoạt động ... kiểm tra hoạt động, nhưng 123TEST sẽ không hoạt động.
fergal_dd

7

Hãy thử mẫu sau:

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

Tuy nhiên nếu người dùng lịch sự và nói "please"điều này sẽ không thành công. Thêm vào đó, trong ví dụ của OP, có một "?" để giải trình.
christopher

1
Bạn có chắc là bạn đã sửa nó?
christopher

Biểu thức này không hoạt động cho một câu trả lời như "10"cho mẫu.
fabdouglas 11/02/18

6

Giải pháp tôi đã đi với trông như thế này:

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));
}

Tôi chắc rằng nó không phải là một giải pháp hoàn hảo, nhưng nó phù hợp với nhu cầu của tôi. Cảm ơn tất cả các bạn đã giúp đỡ. :)


1

Bạn có thể thử cái này

String text = "ddd123.0114cc";
    String numOnly = text.replaceAll("\\p{Alpha}","");
    try {
        double numVal = Double.valueOf(numOnly);
        System.out.println(text +" contains numbers");
    } catch (NumberFormatException e){
        System.out.println(text+" not contains numbers");
    }     

1

Vì bạn không chỉ muốn tìm kiếm một số mà còn trích xuất nó, bạn nên viết một hàm nhỏ làm điều đó cho bạn. Đi từng chữ cái cho đến khi bạn phát hiện ra một chữ số. À, vừa tìm thấy mã cần thiết cho bạn trên stackoverflow: tìm số nguyên trong chuỗi . Nhìn vào câu trả lời được chấp nhận.


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+.*")chỉ hoạt động cho các số chứ không phải các ký hiệu khác như //hoặc *v.v.


0

ASCII ở phần đầu của UNICODE, vì vậy bạn có thể làm như sau:

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

Tôi chắc rằng bạn có thể tìm ra các giá trị khác ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.