Sprawdź, czy ciąg zawiera liczby Java


102

Piszę program, w którym użytkownik wprowadza ciąg znaków w następującym formacie:

"What is the square of 10?"
  1. Muszę sprawdzić, czy w łańcuchu znajduje się liczba
  2. a następnie wyodrębnij tylko liczbę.
  3. Jeśli używam .contains("\\d+")lub .contains("[0-9]+"), program nie może znaleźć liczby w ciągu, bez względu na dane wejściowe, ale .matches("\\d+")będzie działać tylko wtedy, gdy są tylko liczby.

Czego mogę użyć jako rozwiązania do znajdowania i wyodrębniania?


Jeśli chcesz wyodrębnić pierwszą liczbę, a nie tylko cyfrę z ciągu wejściowego, zobacz moją odpowiedź.
Sajal Dutta

Odpowiedzi:


232

Spróbuj tego

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

2
co robi podwójny lewy ukośnik?
ankit

16
Aby wyjaśnić:. * Oznacza dowolny znak od 0 do nieskończonego występowania, niż \\ d + (podwójny ukośnik odwrotny, jak sądzę, służy do pominięcia drugiego ukośnika odwrotnego), a \ d + oznacza cyfrę od 1 raz do nieskończoności.
Giudark

6
To nie obca magia, to tajemniczy BS, z czasów, gdy nikt nie mógł tego zrobić, ale inżynierowie, którzy to wymyślili, ponieważ jest to w zasadzie tajny kod, który znają tylko twórcy, dopóki go nie udostępnią.
JamisonMan111

Zmodyfikowany, ponieważ jeśli występuje tylko jedna cyfra, rozwiązanie jest wystarczająco dobre, w tym przypadku nie ma potrzeby mieć 1 lub więcej cyfr.
Yassin Hajaj

27

Jeśli chcesz wyodrębnić pierwszą liczbę z ciągu wejściowego, możesz:

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

Przykłady:

Dla danych wejściowych „123abc” powyższa metoda zwróci 123.

Dla „abc1000def”, 1000.

W przypadku „555abc45”, 555.

W przypadku „abc” zwróci pusty ciąg.


11

Myślę, że jest szybszy niż 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;
}

Przykro mi, że nie widziałem wypakowywania.Jeśli chcesz wyodrębnić liczbę w ciągu, możesz łatwo edytować ten kod.
Melih Altıntaş

10

s=s.replaceAll("[*a-zA-Z]", "") zastępuje wszystkie alfabety

s=s.replaceAll("[*0-9]", "") zastępuje wszystkie cyfry

jeśli wykonasz powyższe dwie zamiany, otrzymasz wszystkie specjalne znaki znaków

Jeśli chcesz wyodrębnić tylko liczby całkowite z pliku String s=s.replaceAll("[^0-9]", "")

Jeśli chcesz wyodrębnić tylko alfabety z pliku String s=s.replaceAll("[^a-zA-Z]", "")

Miłego kodowania :)


10

Nie mogłem znaleźć żadnego poprawnego wzoru. Postępuj zgodnie z poniższym przewodnikiem, aby uzyskać małe i słodkie rozwiązanie.

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

To działa naprawdę dobrze. Jedyną rzeczą, na którą musisz uważać, jest to, czy ciąg zawiera lewy ukośnik. Jeśli tak, myślę, że spowoduje to błąd „niedozwolonego znaku ucieczki”.
w3bshark,

to jest najlepsze
Yashwin Munsadwala

9

Poniższy kod wystarczy do „Sprawdź, czy ciąg zawiera liczby w Javie”

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
Pierwsza linia zawiera drobny błąd, brak nawiasu w ciągu znaków. Wzorzec p = Wzorzec.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi

też to nie działa ... test działa, ale 123TEST nie zadziała.
fergal_dd

7

Wypróbuj następujący wzór:

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

Jednak jeśli użytkownik jest uprzejmy i mówi, że "please"to się nie powiedzie. Dodatkowo w przykładzie OP jest znak „?” w celu uwzględnienia.
christopher,

1
Czy na pewno to naprawiłeś?
christopher,

To wyrażenie nie działa w przypadku odpowiedzi takiej jak "10"dla próbki.
fabdouglas

6

Rozwiązanie, które wybrałem, wygląda następująco:

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

Na pewno nie jest to idealne rozwiązanie, ale odpowiadało moim potrzebom. Dziękuję wszystkim za pomoc. :)


1

Możesz tego spróbować

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

Ponieważ chcesz nie tylko wyszukać liczbę, ale także ją wyodrębnić, powinieneś napisać małą funkcję, która zrobi to za Ciebie. Idź list po literze, aż zauważysz cyfrę. Ach, właśnie znalazłem niezbędny kod w stackoverflow: znajdź liczbę całkowitą w łańcuchu . Spójrz na zaakceptowaną odpowiedź.


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+.*")działa tylko dla liczb, ale nie dla innych symboli, takich jak //lub *itp.


0

ASCII znajduje się na początku UNICODE, więc możesz zrobić coś takiego:

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

Jestem pewien, że potrafisz rozgryźć inne wartości ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.