2017-06-30 2 views
0

Wenn Java-Regular-Expression pattern.matcher() verwenden, stimmt Quell nicht Regex.But , mein Hoffnungsergebnis ist, Quelle stimmt mit Regex überein.Bei Verwendung von Java Regulärer Ausdruck pattern.matcher(), Quelle stimmt nicht überein regex.But, mein Hoffnung Ergebnis ist, Quelle entspricht Regex

  • String source = "ONE.TWO"
  • String regex = "^ONE\\.TWO\\..*"
 

    import java.util.regex.Pattern; 

    public class Test { 
     public static void main(String[] args) { 
      test(); 
     } 

     public static void test() { 
      Test stringDemo = new Test(); 
      stringDemo.testMatcher(); 
     } 

     public void testMatcher() { 
      String source = "ONE.TWO"; 
      String regex = "^ONE\\.TWo\\..*"; 
      // The result = false, "not match". But, the hope result is true, "match" 
      matcher(source, regex); 
     } 

     public void matcher(String source, String regex) { 
      Pattern pattern = Pattern.compile(regex); 

      boolean match = pattern.matcher(source).matches(); 
      if (match) { 
       System.out.println("match"); 
      } else { 
       System.out.println("not match"); 
      } 
     } 
    } 

+0

Warum Ihre Hoffnung "wahr" ist?^^ weil es einfach aus vielen Gründen nicht funktionieren kann, und das leichtere ist 'W' passt nicht 'w' – azro

Antwort

1

in Ihrem Code Ihr regulärer Ausdruck erwartet die o in TWO unterer Fall zu sein und erwartet, dass sie von einem . folgen.

Versuchen:

String source = "ONE.TWo."; 

Dies wird Ihren regulären Ausdruck wie in Ihrer Frage codiert.

Der Ausdruck \. bedeutet, dass ein Literalpunkt (statt irgendeines Zeichens) gefunden wird. Wenn Sie dies in eine Java-Zeichenfolge codieren, müssen Sie den umgekehrten Schrägstrich mit einem anderen umgekehrten Schrägstrich umgehen, so dass es "\\." wird.

Die .* am Ende des Ausdrucks bedeutet "übereinstimmen null oder mehr eines beliebigen Zeichens (außer Zeilenumbruch)".

würde dies also auch passen:

String source = "ONE.TWo.blah blah"; 
+0

Es funktioniert für mich. Danke U. Ich kann 'String regex ="^ONE \\. TWO \\ .. * "' nicht ändern, weil es Antwort einer API-Anfrage ist. Aber ich kann meine Verwendung '' 'source''' ändern: 'boolean match = pattern.matcher (source) .matches() || pattern.matcher (source + "."). matches(); ' – Vicky

0

Pattern Matching ist Groß- und Kleinschreibung von Default. In Ihrem Fall hat die Quelle einen Großbuchstaben O und Regex einen Kleinbuchstaben o.

So haben Sie Pattern.CASE_INSENSITIVE oder Ändern Sie den Fall von o

Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE); 

oder

String regex = "^ONE\\.TWO\\..*"; 
+0

Ich kann' '' String regex = "^ ONE \\. TWO \\ .. *" '' 'nicht ändern, weil es eine Antwort von einem ist API-Anfrage Aber, Danke U trotzdem. – Vicky

0

hinzufügen Ihre Regex etwas falsch ist. Sie haben einen zusätzlichen Punkt hier:

String regex = "^ONE\.TWO\.(extra dot).*"

versuchen diese, ohne Punkt:

String regex = "^ONE\.TWO.*"

+0

Ich kann '' 'String regex ="^ONE \\. TWO \\ .. * "' '' nicht ändern, weil es die Antwort einer API-Anfrage ist. Aber, Danke U trotzdem. – Vicky

1

Nun, es aus zwei Gründen nicht überein:

  • Ihre regex "^ONE\\.TWo\\..*" unterscheidet nicht zwischen Groß- und Kleinschreibung. Wie also erwarten Sie, dass TWo mit TWO übereinstimmt.
  • Und Ihre Regex erwartet ein . Zeichen am Ende, während Ihre Zeichenfolge "ONE.TWO" es nicht hat.

Verwenden Sie die folgende Regex, Ihre Quelle String zu:

String regex = "^ONE\\.TWO\\.*.*"; 
+0

Ich kann '' 'String regex ="^ONE \\. TWO \\ .. * "' '' nicht ändern, weil es die Antwort einer API-Anfrage ist. Aber, Danke U trotzdem. – Vicky

+0

@Vicky Also müssen Sie die Regex anpassen, um es anzupassen. –

+0

Ja. Regex-Liste ist die API-Antwort. Diese Regex-Liste ist für die meisten Daten nützlich. Nur zwei Regex ist nicht nützlich. Ich muss extra benutzerdefinierte Regex für den speziellen Fall schreiben. – Vicky

Verwandte Themen