2013-03-07 13 views
5

Ho un'espressione regolare che ho verificato in 3 origini separate in modo che corrisponda correttamente al testo desiderato.C# Regex Pattern Enigma

  1. http://regexlib.com/RETester.aspx
  2. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx,
  3. http://sourceforge.net/projects/regextester/

Ma, quando uso l'espressione regolare nel mio codice. Non produce una corrispondenza. Ho usato altre regex con questo codice e hanno prodotto le corrispondenze desiderate. Sono in perdita ...

string SampleText = "starttexthere\r\nothertexthereendtexthere"; 
string RegexPattern = "(?<=starttexthere)(.*?)(?=endtexthere)"; 
Regex FindRegex = new Regex(@RegexPattern); 
Match m = FindRegex.Match(SampleText); 

Non so se il problema è il mio regex, o il mio codice.

risposta

7

Il problema è che il testo contiene uno \r\n che significa che è diviso su due righe. Se si desidera far corrispondere l'intera stringa si deve impostare il option per abbinare su più linee, e di cambiare il comportamento del . per includere il (nuovo personaggio-line) \n in abbinato

Regex FindRegex = new Regex(@RegexPattern, RegexOptions.Multiline | RegexOptions.Singleline); 
+0

provato già. Regex.Match (SampleText, @RegexPattern, RegexOptions.Multiline) .Groups [1] .Value.ToString() restituisce una stringa vuota – s15199d

+0

e se si include RegexOptions.Multiline | RegexOptions.Singleline pure –

+0

Grazie Miky! Aveva bisogno sia di Multiline che di Singleline. – s15199d

0

È don' t necessario RegexOptions.Multiline.

Il problema nel tuo caso è che il punto corrisponde a qualsiasi carattere tranne i caratteri di interruzione di riga (\r\ e \n).

Quindi, è necessario definire il modello regolare di espressione in questo modo: (?<=starttexthere)[\w\r\n]+(?=endtexthere) in modo da abbinare specificamente il testo alle interruzioni di riga.

Ecco un campione di corsa in linea: http://ideone.com/ZXgKar

+0

Che non corrisponde a http://regexlib.com/RETester.aspx – s15199d

+0

@ s15199d sì, corrisponde * fa * corrisponde. Inoltre, il codice nel collegamento ideone funziona. – GolfWolf