2016-05-01 28 views
1

Ok, also ich denke, ich habe einen Griff zur Negation - nun, was ist nur mit einer Übereinstimmung, die einen bestimmten Teilstring innerhalb hat?C# Regex - passt nur, wenn Teilzeichenfolge existiert?

This is a random bit of information from 0 to 1. 
    This is a non-random bit of information I do NOT want to match 
This is the end of this bit 

This is a random bit of information from 0 to 1. 
    This is a random bit of information I do want to match 
This is the end of this bit 

Und versucht, die folgende regex:

Gegeben

/(?s)This is a random bit(?:(?=This is a random).)*?This is the end/g 

Warum ist das nicht funktioniert? Was vermisse ich?

Ich verwende regexstorm.com zum Testen ...

+0

Was erwartet das Ergebnis genau? – Shafizadeh

+0

Sollte der gesamte zweite Textblock ausgewählt werden, nicht der erste. Was ich suche zu erreichen: 1) ein Spiel auf einer Teilfolge einer Linie basiert Bestimmen 2) Bestimmen Sie ein Spiel, das mit einem Teil-String einer Linie Capture- 3) endet, basierend auf einem zufälligen Zeichenkette innerhalb dieses Anfangs/Endes einer Übereinstimmung. – John

+0

Ihr Beispiel String ist verwirrend, sollten Sie einen besseren, kürzer und klarer schreiben. –

Antwort

2

Sie ruiniert einen temperierten gierig Token durch die negative Vorschau in eine positive verwandeln. Es wird nicht so funktionieren, weil der positive Vorausblick erfordert, dass der Text an jeder Position nach This is a random bit gleich ist.

Sie benötigen:

  • Spiel der führenden Trennzeichen (This is a random bit)
  • Spiel all 0+ Text, der nicht die führenden/Schließ-Trennzeichen und nicht der erforderliche zufällige Text innerhalb dieses Blockes ist
  • Spiel der bestimmte Zeichenfolge innerhalb (This is a random)
  • Spiel all 0+ Text, der nicht das führenden/Schließen ist delimiters
  • Spiel der Endbegrenzer (This is the end)

So verwenden

(?s)This is a random bit(?:(?!This is a random bit|This is the end|This is a random).)*This is a random(?:(?!This is a random bit|This is the end).)*This is the end 

Siehe regex demo

  • (?s) - DOTALL Modus auf (. entspricht einem Newline)
  • This is a random bit - Führende Begrenzer
  • (?: # Start of the tempered greedy token (?!This is a random bit # Leading delimiter | This is the end # Trailing delimiter | This is a random) # Sepcific string inside . # Any character )* # End of tempered greedy token
  • This is a random - angegebene Teil
  • (?:(?!This is a random bit|This is the end).)* - Ein weiteres temperiert gierigen Token keinen Text führenden/Schließen Trennzeichen bis zum ersten passenden ...
  • This is the end - Hinter Begrenzer
+1

Wiktor, ich schulde dir ein Bier, Sir. Das war eine wundervolle Erklärung - danke! Ich werde immer weiter davon wegstecken. Ich werde es schließlich herausfinden, mit hilfsbereiten Leuten wie dir auf SO. – John

+0

Gut zu helfen. Wenn es für Sie funktioniert, bitte in Betracht ziehen, zu akzeptieren. –

0

Ich wünsche Ihnen (?:(?=This is a random).) verstehen kann nur einmal, niemals zweimal, wenn es quantifiziert wurde. Zum Beispiel kann Th den Lookahead erfüllen. Wenn das T verbraucht wird, ist das nächste Zeichen h, das den Lookahahe niemals erfüllen wird. Der nächste Ausdruck wird ausgewertet, um nie wieder zum Lookahead zurückzukehren. Verwenden Sie stattdessen ein negatives Lookahead.