2009-02-13 15 views

Antwort

26

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

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

Dies wird jede Folge von Zeichen Buchstaben entsprechen, die „ihm“ als ganzes Wort gefolgt von einem Leerzeichen folgt. es nicht Ergebnisse „sehr“ selbst, brauchen Sie nicht etwa wieder aufstecken im Fall von beispielsweise zur Sorge Ersatz.

Wie in 1 sagte, 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 funktionieren.)

+0

schlag mich auch :) – annakata

+0

Lookbehinds neigen dazu, ziemlich begrenzt zu sein, wenn es darum geht, Wildcards zu verwenden. – cletus

+0

Lookbehinds sind hier vielleicht gar nicht nötig. Je nachdem, auf was "Ich möchte übereinstimmen" in der Frage verweist, siehe David Kemps Lösung. – user55400

-1

, die b \ \ B

EDIT (. *): obwohl je nach regex Implementierung dieser hungrig sein könnte und alle Worte nach diesen

+0

Das wird den Rest des Satzes entsprechen. – cletus

+0

Sie müssen das nicht gierig machen – tliff

+0

Eigentlich ist es nicht implementierungsabhängig, oder zumindest habe ich nie eine Regex-Implementierung, die standardmäßig nicht gierig ist. Non-Greedy ist immer ein Schalter (zumindest in Perl, PHP, Java und .Net). – cletus

1

, die (\ w *) \ b finden

+0

Das scheint nur Ipsum zu entsprechen. –

+0

Ich würde wahrscheinlich machen, dass \ b + (\ w +) mindestens – cletus

+0

ipsum \ b + (\ w +) ist keine gültige Regex. –

4

Einige der anderen Responder vorgeschlagen haben, einen regulären Ausdruck verwenden, das nicht auf Lookbehinds abhängt, aber 1 denken, ein komplettes, arbeitet beispielsweise benötigt, um den Punkt zu kommen über. Die Idee ist, dass Sie die gesamte Sequenz übereinstimmen („Forschung“ 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 "smart" und "jetzt". Um das zu tun mit der Lookbehind-Version, würden Sie so etwas wie hackish tun:

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

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

scheinen jedoch 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; sie stimmt mit der Position (oder Grenze) zwischen dem ‚m‘ und dem Raum.

Es ist ein weit verbreiteter Irrtum, eine 1've sogar in ein paar Bücher und Tutorials wiederholt gesehen, aber das Wort-Grenze Konstrukt, \b paßt nie irgendwelche Zeichen. 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 einer voraus.

0

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

verwenden Dies wird auch das zweite Vorkommen erhalten (Nunc)

Verwandte Themen