Abrufen des folgenden Textes nach dem regulären Ausdruck

84

Ich bin neu in der Verwendung von Regex. Ich habe eine Reihe von Tutorials durchlaufen, aber ich habe keine gefunden, die für das gilt, was ich tun möchte.

Ich möchte nach etwas suchen, aber alles zurückgeben, aber nicht die Suchzeichenfolge selbst

zB " Ein lahmer Satz, der großartig ist "

Suche nach " Satz "

return " das ist großartig "

Jede Hilfe wäre sehr dankbar

Dies ist meine bisherige Regex

sentence(.*) 

aber es kehrt zurück: Satz, der fantastisch ist

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}
Scott
quelle
Was ist Ihr aktueller Anruf? Benutzt du Matcher?
Grzegorz Oledzki
Ich benutze Matcher und Muster
Scott
... und wir möchten immer noch Ihren tatsächlichen Java-Code sehen, um zu bewerten, was falsch ist.
Steve Jorgensen
System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Nishant
3
@ DavidIsNotHere Nazi sollte eine Hauptstadt N haben ...
Lee Taylor

Antworten:

135

Sie können dies mit "nur dem regulären Ausdruck" tun, wie Sie in einem Kommentar gefragt haben:

(?<=sentence).*

(?<=sentence)ist ein positiver Blick hinter die Behauptung . Dies stimmt an einer bestimmten Position in der Zeichenfolge überein, nämlich an einer Position direkt nach dem Text, sentenceohne dass dieser Text selbst Teil der Übereinstimmung ist. Folglich (?<=sentence).*wird jeder Text danach übereinstimmen sentence.

Dies ist eine nette Funktion von Regex. In Java funktioniert dies jedoch nur für Unterausdrücke mit endlicher Länge, dh es (?<=sentence|word|(foo){1,4})ist legal, ist es aber (?<=sentence\s*)nicht.

Tim Pietzcker
quelle
Sie geben an, dass die positive Lookbehind-Behauptung nicht enthalten sein sollte. Ich gehe also davon aus, dass ". * (? <= Satz)" alles zurückgeben sollte, aber "Satz" nicht einschließt. Aber es gibt keinen "Satz". Was vermisse ich?
JJJones_3860
@ user2184214: Das liegt daran, dass es ein Blick hinter die Behauptung ist. .*stimmt mit einem beliebigen Text überein und (?<=...)sucht dann rückwärts nach dem Wort sentence, wobei in diesem Fall behauptet wird, dass die Übereinstimmung mit diesem Wort endet. Wenn Sie vor diesem Wort anhalten möchten, müssen Sie nach vorne schauen : Entspricht .*(?=sentence)jedem Text, dem folgt sentence.
Tim Pietzcker
17

Ihre Regex "sentence(.*)"ist richtig. Um den Inhalt der Gruppe in Klammern abzurufen, rufen Sie Folgendes auf:

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

Beachten Sie die Verwendung von m.find()in diesem Fall (versucht, irgendwo in der Zeichenfolge zu finden) und nicht m.matches()(würde aufgrund des Präfixes "some lame" fehlschlagen; in diesem Fall müsste der reguläre Ausdruck sein ".*sentence(.*)").

st.never
quelle
Danke, aber was ist, wenn ich nur möchte, dass es "das ist großartig" zurückgibt
Scott
Danke Mann, das hat großartig funktioniert. Ich hatte gehofft, dass es einen Weg gibt, dies nur mit dem regulären Ausdruck zu tun. Wenn ich keinen Weg finde, dies so zu tun, wird dies auch funktionieren
Scott
Wahrscheinlich eine schlechte Idee, ein "(. *)" Am Ende des regulären Ausdrucks für die Aufführung
hinzuzufügen
8

Wenn Matcher mit initialisiert ist str, können Sie nach dem Match den Teil nach dem Match mit abrufen

str.substring(matcher.end())

Beispielcode:

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

Ausgabe:

das ist genial

Sean Patrick Floyd
quelle
matcher.find()ist vorher erforderlich, IMO.
Nishant
@ Nishant das habe ich geschrieben: "nach dem Match". Beispielcode zur Veranschaulichung hinzugefügt
Sean Patrick Floyd
1

Sie müssen die Gruppe (int) Ihres Matchers verwenden - Gruppe (0) ist die gesamte Übereinstimmung und Gruppe (1) ist die erste Gruppe, die Sie markiert haben. In dem von Ihnen angegebenen Beispiel steht Gruppe (1) nach " Satz ".

Rami C.
quelle
1

Sie müssen nur "group (1)" anstelle von "group ()" in die folgende Zeile setzen, und die Rückgabe ist die, die Sie erwartet haben:

System.out.println("I found the text: " + matcher.group(**1**).toString());
Ricardo Ferreira
quelle