2016-09-14 2 views
0

Ich versuche eine Erfassungsgruppe nur zu akzeptieren, wenn das Muster übereinstimmt und vor dem Ende der Gruppe kein bestimmtes Wort vorhanden ist. Ich habe eine Anzahl der Ansätze ausprobiert und keiner scheint zu arbeiten, klar bin ich nicht, das Konzept bekommen:Negative Zusicherung für Ende der Zeichenfolge beheben

https://regex101.com/r/iP2xY0/3 https://regex101.com/r/iP2xY0/4

Unabhängig davon, was ich tun, um meine Capture-Gruppe etwas und mein Ziel erfasst, wenn die In der Mitte des Musters gibt es ein Abweisungswort, um keine Übereinstimmung zurückzugeben.

RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice))(?!Reject).* 
  • RC: * Hallo Bob Smith < \ Person>
  • RC: * Hallo David Jones * Hinweise Bla bla < \ Person>
  • RC: * Hallo Ted Warren * Abgelehnt < \ Person >

Capture-Namegrouop wird zurückkehren soll:

  • Bob
  • David
  • ''

So "Ablehnen" sagt, wenn die NameGroup Erfassung von irgendetwas gefolgt endet in < Capture gefunden wird, wenn zwischen dem NameGroup und dem < das Wort Reject erscheint tun nicht.

+0

https://regex101.com/r/iP2xY0/5, die nur ablehnen –

+0

@be_good_do_good Danke. Was ich suche, ist jedoch die Übereinstimmung von 'Bob' in String1,' David' in String2 und nichts in String3. – user3649739

Antwort

0

Ich würde empfehlen, Ihre negative Vorausschau am Anfang Ihres Musters zu setzen. Diese prüft zunächst, ob Ihr Wort in der Zeichenfolge ablehnen existiert und nur dann, wenn sie nicht da ist, wird es versuchen, den Rest der Zeichenfolge entspricht:

(?!.*Rejected.*)RC:\*.*?(?P<Capture>(Bob|David|Ted|Alice)).*

https://regex101.com/r/iP2xY0/6

+0

Das funktioniert tatsächlich, ich schätze also "negative Vorausschau" :). Ich akzeptierte die Antwort, weil es in der Tat richtig ist, aber ich stoße auf Probleme, wie ich es mit Timeouts verwende. Ich habe zwei "Pipes", die erste besagt, dass die Capture-Gruppe der ersten Pipe verwendet wird, wenn ein Begriff nicht erscheint, und die zweite Pipe verwendet, wenn dies der Fall ist: https://regex101.com/r/bU6cU6/1, wobei Ihre Lösung für neg Lookahead verwendet wird um die erste Pfeife zu qualifizieren. Allerdings ist die negative Phrase tatsächlich um 3k Zeichen in den Text und bekomme Timeouts https://regex101.com/r/bU6cU6/2 Gibt es einen Weg um das oder ist es nur eine Funktion von neg Lookahead? – user3649739

+0

Die seltsame Sache in der Zeitüberschreitung ist es dauert nur 32 Schritte für Regex um herauszufinden, die erste Pipe funktioniert nicht auf eigene und 18 Schritte, um herauszufinden, die zweite Pipe funktioniert auf eigene Faust. Also nicht sicher, was Regex macht, würde es aussperren. Sollte es nicht a) erste Leitung prüfen, 32 Schritte, ablehnen, weiter zur zweiten Leitung, 18 Schritte annehmen? – user3649739

+1

Setzen Sie den Lookahead nach 'RC:', um unnötiges Backtracking zu vermeiden. –

Verwandte Themen