Ü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?


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.*");

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.


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

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 :)


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

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

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

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+.*")

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. :) :)


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

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.


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+.*")funktioniert nur für Zahlen, aber nicht für andere Symbole wie //oder *etc.


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 ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.