2016-12-10 2 views
0

Ich habe die folgende Regex:Regex mit SKIP für .NET

'[^']*'(*SKIP)(F)|\b[_A-Za-z]\w\b(?![(']).

und es funktioniert wie erwartet fein (wählen Sie Variablen aus dem Ausdruck). Aber wenn ich versuche, es in .NET zu verwenden:

private string regex = @"'[^']*'(*SKIP)(*F)|\b[_A-Za-z]\w*\b(?![('])"; 
private string _expression = @"12+x1+455+'ggg+4+rrr+tt'+3" 

var matches = Regex.Matches(_expression, regex); 

es findet nichts. Ich denke, es ist spezifisch, SKIP in Regex der .NET-Klasse zu verwenden.

Antwort

1

(*SKIP)(*F) sind PCRE specific Verben.

Alternativ nur außerhalb von einfachen Anführungszeichen look ahead für eine gleichmäßige (ausgeglichene) ' ... ' Menge übereinstimmen.

\b[_A-Za-z]\w*\b(?![('])(?=(?:[^']*'[^']*')*[^']*$) 

See demo at regexstorm

Es gibt einige ganz ähnliche Antworten bereits verfügbar: @vks, @MarkusQ

+0

Es tut mir leid, aber diese Regex wird Ihr Programm verlangsamen Es ist * keine * gute Lösung und - mehr - Es ist auch keine gute Problemumgehung –

+0

@ WiktorStribiżew Das ist nur eine leere Anweisung.Um diese Regex bei der Eingabe zu verwenden, die der Länge der Samples ähnlich ist, werden überhaupt keine Probleme verursacht (: Natürlich, wenn die Eingabe groß ist, wird es Grenzen. –

1

In .NET und die meisten anderen Aromen, Spiel und Capture, was Sie brauchen und nur entsprechen, was Sie nicht brauchen:

'[^']*'|\b([_A-Za-z]\w*)\b(?![(']) 

Siehe regex demo

C# demo:

var regex = @"'[^']*'|\b([_A-Za-z]\w*)\b(?![('])"; 
var _expression = @"12+x1+455+'ggg+4+rrr+tt'+3"; 
var matches = Regex.Matches(_expression, regex) 
     .Cast<Match>() 
     .Select(m => m.Groups[1].Value) 
     .ToList(); 

Alternativ PCRE.NET verwenden.

+0

Wie ausschließen 'ggg + 4 + rrr + tt' aus dem Ergebnis? –

+0

Haben Sie die Demo gesehen? Es ist alles da. '.Gruppen [1] .Wert 'hält, was Sie brauchen. –

+0

Ich brauche nicht 'ggg + 4 + rrr + tt' im Ergebnis überhaupt :) –