Überprüfen Sie, ob ein String Java-Zahlen enthält

102

Ich schreibe ein Programm, in dem der Benutzer einen String im folgenden Format eingibt:

"What is the square of 10?"
  1. Ich muss überprüfen, ob der String eine Nummer enthält
  2. und extrahieren Sie dann nur die Zahl.
  3. Wenn ich .contains("\\d+")oder verwende .contains("[0-9]+"), kann das Programm keine Zahl in der Zeichenfolge finden, unabhängig von der Eingabe, sondern .matches("\\d+")funktioniert nur, wenn nur Zahlen vorhanden sind.

Was kann ich als Lösung zum Suchen und Extrahieren verwenden?

Duane
quelle
Wenn Sie die erste Zahl und nicht nur die Ziffer aus der Eingabezeichenfolge extrahieren möchten, lesen Sie meine Antwort.
Sajal Dutta

Antworten:

229

Versuche dies

str.matches(".*\\d.*");
Evgeniy Dorofeev
quelle
2
Was macht der doppelte Backslash?
Ankit
15
Um zu erklären :. * Bedeutet jedes Zeichen von 0 bis unendlich, als das \\ d + (doppelter Backslash, denke ich, um dem zweiten Backslash zu entkommen) und \ d + bedeutet eine Ziffer von 1 Mal bis unendlich.
Giudark
6
Es ist keine fremde Magie, sondern eine kryptische BS aus der Zeit, als niemand dieses Zeug machen konnte, außer den Ingenieuren, die es erfunden haben, weil es im Grunde ein Geheimcode ist, den nur die Schöpfer kennen, bis sie ihn teilen.
JamisonMan111
Geändert, da die Lösung gut genug ist, wenn nur eine Ziffer vorhanden ist. In diesem Fall müssen keine oder mehrere Ziffern vorhanden sein.
Yassin Hajaj
26

Wenn Sie die erste Zahl aus der Eingabezeichenfolge extrahieren möchten, können Sie Folgendes tun:

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

Beispiele:

Für die Eingabe "123abc" gibt die obige Methode 123 zurück.

Für "abc1000def" 1000.

Für "555abc45" 555.

Gibt für "abc" eine leere Zeichenfolge zurück.

Sajal Dutta
quelle
11

Ich denke, es ist schneller als 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ş
quelle
Es tut mir leid, dass ich das Extrahieren nicht gesehen habe. Wenn Sie die Zahl in einer Zeichenfolge extrahieren möchten, können Sie diesen Code einfach bearbeiten.
Melih Altıntaş
10

s=s.replaceAll("[*a-zA-Z]", "") ersetzt alle Alphabete

s=s.replaceAll("[*0-9]", "") ersetzt alle Zahlen

Wenn Sie mehr als zwei Ersetzungen durchführen, erhalten Sie alle Zeichenfolgen mit Sonderzeichen

Wenn Sie nur ganze Zahlen aus a extrahieren möchten String s=s.replaceAll("[^0-9]", "")

Wenn Sie nur Alphabete aus a extrahieren möchten String s=s.replaceAll("[^a-zA-Z]", "")

Viel Spaß beim Codieren :)

Mallikarjuna Sangisetty
quelle
10

Ich konnte kein einziges korrektes Muster finden. Bitte folgen Sie der Anleitung für eine kleine und süße Lösung.

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();
Ishaan
quelle
Das funktioniert wirklich gut. Das einzige, worauf Sie achten müssen, ist, ob die Zeichenfolge einen Schrägstrich enthält. Wenn dies der Fall ist, wird dies meiner Meinung nach einen Fehler "Unzulässiges Escapezeichen" hervorrufen.
w3bshark
Dies ist das Beste
Yashwin Munsadwala
9

Der folgende Code reicht aus für "Überprüfen Sie, ob ein String in Java Zahlen enthält".

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

if(m.find()){
    System.out.println("Hello "+m.find());
}
Narendra
quelle
8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);
Reddy
quelle
3
Die erste Zeile weist einen geringfügigen Fehler auf, die Klammer fehlt in der Zeichenfolge. Pattern p = Pattern.compile ("(([AZ]. * [0-9]))");
Gaurav Tyagi
Auch das funktioniert nicht ... der Test funktioniert, aber 123TEST funktioniert nicht.
fergal_dd
7

Versuchen Sie das folgende Muster:

.matches("[a-zA-Z ]*\\d+.*")
Konstantin Yovkov
quelle
Wenn der Benutzer jedoch höflich ist und sagt, dass "please"dies fehlschlagen wird. Außerdem gibt es im Beispiel von OP ein "?" zu erklären.
Christopher
1
Bist du sicher, dass du es behoben hast?
Christopher
Dieser Ausdruck funktioniert nicht für eine Antwort wie "10"für Beispiel.
Fabdouglas
6

Die Lösung, mit der ich mich entschieden habe, sieht folgendermaßen aus:

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

Ich bin sicher, dass es keine perfekte Lösung ist, aber es hat meinen Bedürfnissen entsprochen. Vielen Dank für die Hilfe. :) :)

Duane
quelle
1

Sie können dies versuchen

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
quelle
1

Da Sie eine Zahl nicht nur suchen, sondern auch extrahieren möchten, sollten Sie eine kleine Funktion schreiben, die dies für Sie erledigt. Gehen Sie Buchstabe für Buchstabe, bis Sie eine Ziffer erkennen. Ah, ich habe gerade den erforderlichen Code für Sie im Stackoverflow gefunden: Finden Sie eine Ganzzahl in einer Zeichenfolge . Schauen Sie sich die akzeptierte Antwort an.

Thorsten Kettner
quelle
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
quelle
1

.matches(".*\\d+.*")funktioniert nur für Zahlen, aber nicht für andere Symbole wie //oder *etc.

Rickyras
quelle
0

ASCII befindet sich am Anfang von UNICODE. Sie können also Folgendes tun:

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

Ich bin sicher, Sie können die anderen Werte herausfinden ...

Brad Yuan
quelle