2016-08-23 1 views
0

Gegeben die Zeichenfolge foobarbarbarfoobar, möchte ich alles zwischen foo haben. Also habe ich diesen Ausdruck dafür benutzt und das Ergebnis ist: barbarbar. Es funktioniert großartig.Regulärer Ausdruck, stimmen Sie alles nicht in

(?<=foo).*(?=foo) 

Jetzt möchte ich auch das Gegenteil. Also, wenn ich die Zeichenfolge foobarbarbarfoobar habe, möchte ich alles, was nicht von foo eingeschlossen ist. Ich habe versucht, den folgenden regulären Ausdruck:

(?<!foo).*(?!foo) 

I bar als Ergebnis erwartet, aber stattdessen gibt es eine Übereinstimmung für foobarbarbarfoobar. Es ergibt keinen Sinn für mich. Was vermisse ich?

Die Erklärung von: https://regex101.com/ sieht gut aus für mich?

(?<!foo).*(?!foo) 
(?<!foo) Negative Lookbehind - Assert that it is impossible to match the regex below 
foo matches the characters foo literally (case sensitive) 
.* matches any character (except newline) 
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
(?!foo) Negative Lookahead - Assert that it is impossible to match the regex below 
foo matches the characters foo literally (case sensitive) 

Jede Hilfe ist wirklich

Antwort

0

ich eine Lösung dafür gefunden:

^((?!foo).)+ 

Erklärung von regex101

^ assert Position an Anfang der Zeichenfolge
1. Capturing Gruppe((?!foo).)+
Quantifizierer: + Zwischen einem und Unlimite d-mal, so oft wie möglich, Rückgabe nach Bedarf
Hinweis: Eine wiederholte Erfassungsgruppe erfasst nur die letzte Iteration. Legen Sie eine Erfassungsgruppe um die wiederholte Gruppe alle Iterationen zu erfassen oder eine nicht-einfangende Gruppe zu verwenden, anstatt, wenn Sie
(?!foo) Negative Lookahead in den Daten nicht interessiert sind - Behaupten, dass es unter
foo Matches unmöglich ist, die Regex übereinstimmen die Zeichen foo buchstäblich (Groß- und Kleinschreibung)
. jedes Zeichen (mit Ausnahme Neue-Zeile)

0

schätzte ich bin der Hoffnung, jemand einen besseren Ansatz findet, aber diese Greuel tun können, was Sie wollen: (.*)foo(?<=foo).*(?=foo)foo(.*)

Der Text vor dem ersten foo in Capture ist Gruppe 1 (mit Ihrem mitgelieferten Beispiel wäre das leer) und danach ist in Aufnahme Gruppe 2 (würde in diesem Fall 'bar' sein)

Wenn Sie möchten, dass die 'foo's an beiden Enden enthalten sind, verwenden Sie stattdessen: (.*)(?<=foo).*(?=foo)(.*). Dies würde zu 'foo' in der Gruppe 1 und 'foobar' in Gruppe 2.