2016-07-20 18 views
2
1) Pattern pattern = Pattern.compile("34238"); 
    Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 
    34238"); 
    if (matcher.find()) { 
     System.out.println("ok"); 
    } 

2) Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$"); 
    Matcher matcher = pattern.matcher("34238"); 
    if (matcher.find()) { 
     System.out.println("ok"); 
    } 

Ausgang für den obigen Code ist: okJava Pattern Matcher funktioniert nicht für regex erwartet als

Aber der folgende Code ist nicht alles drucken:

Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$"); 
    Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 34238"); 
    if (matcher.find()) { 
     System.out.println("ok"); 
    } 

Was ist der Grund, dafür nicht zu drucken ok? Ich benutze das gleiche Muster auch hier.

+0

Warum nicht '' 6003 Honore Ave Suite 101 Sarasota Florida, 34238 ".enthält (" 34238 ")'? –

+0

Es ist US-Postleitzahl Format.Wir sind nicht sicher, wird das gleiche bekommen – PSR

+0

Schließlich muss ich Wetter finden, dass Satz hat US-Postleitzahl oder nicht – PSR

Antwort

2

Der Code ist gut und funktioniert wie erwartet. In den 2) und 3) Block in Ihrer Frage verwenden Sie die gleichen Regex aber unterschiedliche Eingabezeichenfolgen.

Wenn Sie jedoch nur überprüfen möchten, ob eine Zeichenfolge eine US-Postleitzahl enthalten muss, ist das Problem, dass Ihre Regex Anker verwendet. Sie sind also nur übereinstimmende Zeilen, die mit einer Postleitzahl beginnen und enden.

Die Zeichenfolgen, die Ihrem Regex entsprechen, sind wie 34238 oder 34238-1234 und stimmen nicht mit something 12345 something überein.

Wenn Sie die Anker zu entfernen, dann werden Sie passen whatever 12345 whatever:

// Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$"); 
//         ^--------- Here -------^ 
Pattern pattern = Pattern.compile("[0-9]{5}(?:-[0-9]{4})?"); 
Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 34238"); 
if (matcher.find()) { 
    System.out.println("ok"); 
} 

Btw, wenn Sie nur überprüfen wollen, ob ein String eine Postleitzahl enthält, dann können Sie String.matches(..) wie folgt verwenden:

String str = "6003 Honore Ave Suite 101 Sarasota Florida, 34238"; 
if (str.matches(".*[0-9]{5}(?:-[0-9]{4})?.*")) { 
    System.out.println("ok"); 
} 

IDEOne demo

+1

@Downvoter, einen Kommentar zur Verbesserung der Antwort? –

2

Obwohl das Muster ist das gleiche, das inpu t-Strings sind unterschiedlich:

  • In Ihrem zweiten Beispiel Ihnen einen passenden String vollständig aus einer Postleitzahl aus, so dass Sie ein Spiel bekommen für ^...$ Ausdruck
  • Das zweite Beispiel nicht mit der Postleitzahl beginnen, So verhindert der Anker ^, dass Ihre Regex nicht übereinstimmt.

^ und $ Anker verwendet werden, wenn Sie möchten, dass Ihr Ausdruck die gesamte Eingabezeile übereinstimmen. Wenn Sie am Anfang übereinstimmen möchten, behalten Sie ^ und entfernen Sie $; Wenn Sie am Ende übereinstimmen möchten, entfernen Sie ^ und behalten Sie $; Wenn Sie irgendwo innerhalb der Zeichenfolge übereinstimmen möchten, entfernen Sie beide Anker.