Java — Pattern — Matcher.Gruppe()?
Also ich habe ein Dokument, und eine bestimmte n-Gramm-Ziel-string. Ich bin versucht zu finden, die Indizes alle vorkommen der Ziel-string.
final Pattern WORD_PATTERN = Pattern.compile("\\w+");
Matcher matcher = WORD_PATTERN.matcher("the lazy dog, jumps, the lazy dog.");
Also die Zeichenfolge "den faulen Hund springt, der faule Hund."
Sagen, mein Ziel-n-Gramm ist "die faulen". Ich wesentlichen 'iterate' durch die gesamte Zeichenfolge wie folgt, hinzufügen 'n' Worten zu einer verknüpften Liste, currentNGram. Wenn alle Wörter in currentNGram entsprechen die Ziel-n-Gramm-ich speichern Sie die index. Sonst, ich Entferne das erste element der verketteten Liste, und fügen Sie auf das nächste Wort in der Eingabe-string (zB. überprüfen Sie die folgenden aufeinander folgenden n-Gramm in Dokument).
while (matcher.find()) {
while (currentNGram.size() < lengthOfTargetNTuple) {
currentNGram.add(matcher.group().toLowerCase());
System.out.println(currentNGram.getLast());
}
}
Also das ist alles schön und gut, aber mein Nächstes problem ist, dass ich zu 'Durchlaufen' durch das Dokument erneut, und finden Sie die Entfernung jedes n-Gramm zum nächsten Ziel-n-Gramm. So nehme ich die exakt gleichen Ansatz. Außer dieser Zeit, wenn ich initialisieren Sie den matcher, und führen Sie die Schleife wie folgt,
while (matcher.find()) {
while (currentGram.size() < lengthOfTargetNTuple) {
currentGram.add(matcher.group().toLowerCase());
System.out.println(currentGram.printLast()) //Psuedocode
}
druckt er das Wort "die" 7-mal statt Druck "" "faul" "Hund" "springt", etc. Allerdings
while (matcher.find()) {
while (currentGram.size() < lengthOfTargetNTuple) {
currentGram.add(matcher.group().toLowerCase());
}
System.out.println(matcher.group()); //Prints words in order, correctly
}
Warum ist das so? Wie kommen die matcher.Gruppe () - Methode aufrufen, ausdrucken Wörter in der richtigen Reihenfolge in das erste problem, aber nicht die zweite? Jede Richtung würde sehr geschätzt werden; ich weiß, das war ein langer post, sorry.
Dank!
InformationsquelleAutor Ryan Yu | 2012-09-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, einige grundlegende Kenntnisse. Mal sehen, was
Matcher.finden
nicht...Als Nächstes werfen wir einen Blick auf
Matcher.group
Nun, dass wir verstehen, wie Sie funktionieren, mal sehen, was die folgende Schleife macht.
Sie drucken
currentGram.printLast
mehrmals promatcher.find
call -- um genau zu sein,lengthOfTargetNTuple
Zeiten.currentGram.printLast
werden müssen, sich daraus ergebenden, die gerade Hinzugefügt --matcher.group().toLowerCase()
. Da haben wir Sie nur genanntmatcher.find
einmal für diese gesamte Schleife, dieser Wert wird sich auch nicht ändern.Hier, jedoch, Sie drucken
matcher.group
nur einmal promatch.find
aufrufen. Dies bedeutet, dass Sie drucken nur jeweils abgestimmt Teilfolge einmal, anstattlengthOfTargetNTuple
Zeiten.InformationsquelleAutor oldrinb