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?

Duane
źródło
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.*");
Evgeniy Dorofeev
źródło
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.

Sajal Dutta
źródło
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;
}
Melih Altıntaş
źródło
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 :)

Mallikarjuna Sangisetty
źródło
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();
Ishaan
źródło
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());
}
Narendra
źródło
8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
Reddy
źródło
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+.*")
Konstantin Yovkov
źródło
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. :)

Duane
źródło
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");
    }     
Ruchira Gayan Ranaweera
źródło
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ź.

Thorsten Kettner
źródło
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";
    }
eyad david
źródło
1

.matches(".*\\d+.*")działa tylko dla liczb, ale nie dla innych symboli, takich jak //lub *itp.

Rickyras
źródło
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 ...

Brad Yuan
źródło