2017-04-05 23 views
1

Dies ist mein Code zu "ab" Muster in angegebenen Zeichenfolge zu finden.Regulärer Ausdruck finden Methode

import java.util.regex.*; 
public class RegExp 
{ 
    public static void main(String[] args) 
    { 
     Pattern p = Pattern.compile("ab"); 
     Matcher m = p.matcher("ababbaba"); 
     while(m.find()) 
     { 
      System.out.println(m.start()); 
     } 
    } 
} 

Aber ich bin nicht in der Lage, interne Arbeits von find() und start() zu verstehen.

+4

Um interne Arbeit zu verstehen, sollten Sie die Quelle lesen. Aber vielleicht möchtest du erklären, was du erwartet hast und was du nicht verstehst. – RealSkeptic

+0

Klassische "Lesen Sie die feine manuelle" Frage. https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#find() –

+0

@RealSkeptic Genau richtig. Sie haben den gleichen Vorschlag wie ich in meiner Antwort hinzugefügt :) – freedev

Antwort

4

Die Methode find scannt die Eingabesequenz nach der nächsten Teilsequenz, die mit dem Muster übereinstimmt, und gibt eine boolean zurück, die den Erfolg des Fehlers angibt.

Intern find Methode ruft die search Methode (Zugriffskontrollstandard) auf, so dass eine Suche nach einem Pattern innerhalb der angegebenen Grenzen initiiert. Bei jeder Übereinstimmung wird die Grenze erhöht, bis alle Übereinstimmungen gefunden wurden.

Hinter der Matcher Klasse ist es eine Zustandsmaschine, die den Zustand des Spiels halten wird.

Auf der anderen Seite start Methode gibt den Startindex als int der Teilsequenz von der letzten Übereinstimmung erfasst.

Wenn Sie wirklich tiefer gehen wollen, schlage ich vor, die source code von Matcher Klasse zu überprüfen.

0

Aktualisiert:

  1. find() versucht, eine Teil zu finden, die das Muster entspricht.
  2. start(), um die Position zurückzugeben, an der die Teilzeichenfolge gefunden wurde.
  3. matches geben Sie true zurück, wenn die gesamte Zeichenfolge dem angegebenen Muster entspricht.
+0

Kein Code nur Antworten, immer eine textuelle Erklärung. –

+0

Dies ist das Codebeispiel. Der Benutzer kann die Eingabe entsprechend den Anforderungen ändern. Getesteter Code! –

+2

Antworten auf StackOverflow sollte ** die Frage beantworten **. Dieses Codebeispiel ist * nicht mit der Frage * verbunden, außer dass es die Methode 'find' verwendet. Es ist * irrelevant *. Der Benutzer fragte nach den internen Funktionen von 'find' und' start'. Es gab keine Frage über faulen/gierigen Abgleich, – RealSkeptic

2

Wie Sie in the documentation of find() lesen:

Versuche, finden die nächste Teilfolge der Eingangssequenz, die dem Muster übereinstimmt.

Dieses Verfahren beginnt am Anfang dieser Region des Matcher, oder, wenn ein vorheriger Aufruf der Methode erfolgreich war und die Matcher haben nicht da gewesen zurückgesetzt, beim ersten Zeichen, das nicht durch das vorherige Spiel abgestimmt.

Wenn die Übereinstimmung erfolgreich ist, können weitere Informationen über die Methoden start, end und group abgerufen werden.

Also, wenn Sie matcher(String text) nennen das erste Mal nichts passiert. Es ist nur, wenn Sie find() anrufen, dass es darauf abzielt, die erste Übereinstimmung zu finden. Wenn Sie ein zweites Mal find() aufrufen, wird es versuchen, das nächste Spiel zu finden und so weiter.

Der folgenden Sequenzdiagramm beschreibt, was passiert:

sequence diagram of the code

Die Matcher konstruiert und find() jedes Mal, wenn die „Cursor“ genannt, auf das nächste Spiel bewegt.