Unterschied zwischen Java Matcher find () und match ()

1. Übersicht

Wenn wir in Java mit regulären Ausdrücken arbeiten, möchten wir normalerweise eine Zeichenfolge nach einem bestimmten Muster durchsuchen . Um dies zu erleichtern, stellt die Java-API für reguläre Ausdrücke die Matcher- Klasse bereit , mit der wir einen bestimmten regulären Ausdruck mit einem Text abgleichen können.

In der Regel möchten wir fast immer eine von zwei gängigen Methoden der Matcher- Klasse verwenden :

  • finden()
  • Streichhölzer()

In diesem kurzen Tutorial lernen wir die Unterschiede zwischen diesen Methoden anhand einfacher Beispiele kennen.

2. Die find () -Methode

Einfach ausgedrückt versucht die find () -Methode, das Auftreten eines Regex-Musters innerhalb einer bestimmten Zeichenfolge zu ermitteln . Wenn in der Zeichenfolge mehrere Vorkommen gefunden werden, springt der erste Aufruf von find () zum ersten Vorkommen. Danach geht jeder nachfolgende Aufruf der find () -Methode nacheinander zum nächsten übereinstimmenden Vorkommen.

Stellen wir uns vor, wir möchten die bereitgestellte Zeichenfolge "Auf Wiedersehen 2019 und Willkommen 2020" nur nach vierstelligen Zahlen durchsuchen .

Dafür verwenden wir das Muster "\\ d \\ d \\ d \\ d" :

@Test public void whenFindFourDigitWorks_thenCorrect() { Pattern stringPattern = Pattern.compile("\\d\\d\\d\\d"); Matcher m = stringPattern.matcher("goodbye 2019 and welcome 2020"); assertTrue(m.find()); assertEquals(8, m.start()); assertEquals("2019", m.group()); assertEquals(12, m.end()); assertTrue(m.find()); assertEquals(25, m.start()); assertEquals("2020", m.group()); assertEquals(29, m.end()); assertFalse(m.find()); }

Da wir in diesem Beispiel zwei Vorkommen haben - 2019 und 2020 - gibt die find () -Methode zweimal true zurück , und sobald sie das Ende der Übereinstimmungsregion erreicht hat, gibt sie false zurück .

Sobald wir eine Übereinstimmung gefunden haben, können wir Methoden wie start () , group () und end () verwenden , um weitere Details über die Übereinstimmung zu erhalten , wie oben gezeigt.

Die Methode start () gibt den Startindex der Übereinstimmung an, end () gibt den letzten Index des Zeichens nach dem Ende der Übereinstimmung zurück und group () gibt den tatsächlichen Wert der Übereinstimmung zurück .

3. Die find (int) -Methode

Wir haben auch die überladene Version der find-Methode - find (int) . Es nimmt den Startindex als Parameter und betrachtet den Startindex als Ausgangspunkt, um nach Vorkommen in der Zeichenfolge zu suchen .

Lassen Sie uns im selben Beispiel wie zuvor sehen, wie diese Methode verwendet wird:

@Test public void givenStartIndex_whenFindFourDigitWorks_thenCorrect() { Pattern stringPattern = Pattern.compile("\\d\\d\\d\\d"); Matcher m = stringPattern.matcher("goodbye 2019 and welcome 2020"); assertTrue(m.find(20)); assertEquals(25, m.start()); assertEquals("2020", m.group()); assertEquals(29, m.end()); }

Da wir einen Startindex von 20 angegeben haben , können wir sehen, dass nur noch ein Vorkommen gefunden wurde - 2020, das erwartungsgemäß nach diesem Index auftritt . Und wie bei find () können wir Methoden wie start () , group () und end () verwenden , um weitere Details über die Übereinstimmung zu extrahieren.

4. Die match () -Methode

Auf der anderen Seite, die matches () versucht Methode die gesamte Zeichenfolge mit dem Muster übereinstimmen .

Für das gleiche Beispiel matches () wird wieder falsch :

@Test public void whenMatchFourDigitWorks_thenFail() { Pattern stringPattern = Pattern.compile("\\d\\d\\d\\d"); Matcher m = stringPattern.matcher("goodbye 2019 and welcome 2020"); assertFalse(m.matches()); } 

Dies liegt daran, dass versucht wird, "\\ d \\ d \\ d \\ d" mit der gesamten Zeichenfolge " Auf Wiedersehen 2019 und Willkommen 2020" abzugleichen - im Gegensatz zu den Methoden find () und find (int) , die beide dies tun Finden Sie das Auftreten des Musters an einer beliebigen Stelle in der Zeichenfolge .

Wenn wir die Zeichenfolge in die vierstellige Zahl ändern „2019“ , dann entspricht () wird wieder wahr :

@Test public void whenMatchFourDigitWorks_thenCorrect() { Pattern stringPattern = Pattern.compile("\\d\\d\\d\\d"); Matcher m = stringPattern.matcher("2019"); assertTrue(m.matches()); assertEquals(0, m.start()); assertEquals("2019", m.group()); assertEquals(4, m.end()); assertTrue(m.matches()); }

Wie oben gezeigt, können wir auch Methoden wie start () , group () und end () verwenden , um weitere Details zum Match zu sammeln. Ein interessanter Punkt ist, dass das mehrmalige Aufrufen von find () nach dem Aufrufen dieser Methoden unterschiedliche Ausgaben zurückgeben kann, wie wir in unserem ersten Beispiel gesehen haben, match () jedoch immer denselben Wert zurückgibt.

5. Schlussfolgerung

In diesem Artikel haben wir anhand eines praktischen Beispiels gesehen, wie sich find () , find (int) und match () voneinander unterscheiden. Wir haben auch gesehen, wie verschiedene Methoden wie start () , group () und end () uns helfen können, mehr Details zu einer bestimmten Übereinstimmung zu extrahieren .

Wie immer ist der vollständige Quellcode des Artikels auf GitHub verfügbar.