Frage

Zum Beispiel in diesem Text:

  

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc eu tellus vel nunc pretium lacinia. Proin sed lorem. Cras sed ipsum. Nunc ein libero quis risus sollicitudin imperdiet.

Ich will nach 'ipsum' das Wort entsprechen.

War es hilfreich?

Lösung

Das klingt wie ein Job für Lookbehinds, obwohl Sie sollten sich bewusst sein, dass nicht alle Regex-Varianten sie unterstützen. In Ihrem Beispiel:

(?<=\bipsum\s)(\w+)

Dies wird eine beliebige Folge von Buchstaben Zeichen übereinstimmen, die durch ein Leerzeichen „ipsum“ als ganzes Wort folgt. Es ist nicht match „ipsum“ selbst, Sie brauchen sich nicht um Wiedereinsetzen es im Falle von beispielsweise zur Sorge Ersatz.

Wie gesagt, obwohl einige Aromen (JavaScript, zum Beispiel) nicht unterstützen Lookbehind überhaupt. Viele andere (die meisten in der Tat) nur „feste Breite“ Lookbehinds unterstützen - so könnte man dieses Beispiel verwenden, aber keine der Wiederholungsoperator. (Mit anderen Worten, (?<=\b\w+\s+)(\w+) würde nicht Arbeit.)

Andere Tipps

Einige der anderen Responder haben vorgeschlagen, einen regulären Ausdruck verwenden, die nicht auf Lookbehinds abhängt, aber ich denke, ein komplettes, arbeitet beispielsweise benötigt, um den Punkt zu bekommen. Die Idee ist, dass Sie die gesamte Sequenz übereinstimmen ( „ipsum“ plus das nächste Wort) in der normalen Art und Weise, dann eine Erfassungsgruppe verwenden, das Teil zu isolieren, das Sie interessiert. Zum Beispiel:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

Beachten Sie, dass diese druckt sowohl „dolor“ und „Nunc“. Um das zu tun mit der Lookbehind-Version, würden Sie etwas tun müssen, um hackish wie:

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

Das ist in Java, die die Lookbehind erfordert eine offensichtliche maximale Länge zu haben. Einige Aromen haben nicht einmal so viel Flexibilität und natürlich einige nicht unterstützen Lookbehinds überhaupt.

Allerdings scheinen die größte Problem der Menschen in ihren Beispielen zu haben ist nicht mit Lookbehinds, sondern mit Wortgrenzen. Sowohl David Kemp und ck scheinen \b zu erwarten, dass die Leerzeichen nach dem ‚m‘ passen, aber es funktioniert nicht; es entspricht die Position (oder Grenze) zwischen dem 'm' und dem Raum.

Es ist ein häufiger Fehler, den ich habe sogar in ein paar Bücher und Tutorials, aber das Wort-Grenze Konstrukt, \b, Streichhölzer nie irgendwelche Zeichen wiederholt gesehen. Es ist eine Null-Breite Behauptung, wie lookarounds und Anker (^, $, \z, etc.), und was es übereinstimmt ist eine Position, die entweder von einem Wortzeichen vorangestellt ist und nicht von einer oder gefolgt von einem Wortzeichen gefolgt und nicht von einem voraus.

ipsum \ b (\ w *)

Mit javascript Sie können (?=ipsum.*?(\w+)) verwenden

Dies wird das zweite Vorkommen erhält auch (Nunc)

ipsum \ b (. *) \ B

EDIT: obwohl auf Ihrer regex Implementierung abhängig, könnte dies hungrig sein und alle Worte nach ipsum

finden
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top