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");
}
Matcher
?System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Antworten:
Sie können dies mit "nur dem regulären Ausdruck" tun, wie Sie in einem Kommentar gefragt haben:
(?<=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,sentence
ohne dass dieser Text selbst Teil der Übereinstimmung ist. Folglich(?<=sentence).*
wird jeder Text danach übereinstimmensentence
.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.quelle
.*
stimmt mit einem beliebigen Text überein und(?<=...)
sucht dann rückwärts nach dem Wortsentence
, 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 folgtsentence
.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 nichtm.matches()
(würde aufgrund des Präfixes "some lame" fehlschlagen; in diesem Fall müsste der reguläre Ausdruck sein".*sentence(.*)"
).quelle
Wenn Matcher mit initialisiert ist
str
, können Sie nach dem Match den Teil nach dem Match mit abrufenBeispielcode:
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:
quelle
matcher.find()
ist vorher erforderlich, IMO.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 ".
quelle
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());
quelle