2017-08-05 2 views
3

Ich habe die folgende Zeichenfolge, die ich mit RegEx analysieren muss.C# Regex-Extrakt-String in einfache Anführungszeichen eingeschlossen

abc = 'def' and size = '1 x(3\" x 5\")' and (name='Sam O\'neal') 

Dies ist ein SQL-Filter, die ich in Token die folgenden Separatoren aufzuspalten möchten verwenden:

(,), >,<,=, whitespace, <=, >=, != 

nach dem String syntaktisch analysiert wird, I der Ausgang sein möchten:

abc, 
=, 
def, 
and, 
size, 
=, 
'1 up(3\" x 5\")', 
and, 
(, 
Sam O\'neal, 
), 

ich habe den folgenden Code versucht:

string pattern = @"(<=|>=|!=|=|>|<|\)|\(|\s+)"; 
var tokens = new List<string>(Regex.Split(filter, pattern)); 
tokens.RemoveAll(x => String.IsNullOrWhiteSpace(x)); 

Ich bin nicht sicher, wie man die Zeichenkette in einfachen Anführungszeichen als ein Token behält. Ich bin neu bei Regex und würde mich über jede Hilfe freuen.

+1

Nach '(' 'Add '[^'] * '|'. –

+0

Danke @ WiktorStribiżew - Ich habe Ihren Vorschlag mit dem folgenden Muster versucht: 'string pattern = @ "(<=|> = |! = | = |> | <| \) | \ (|' [^ '] *' | \ S +) ";" Während das String-Literal '1 bis (3 \ "x 5") "als ein Token angezeigt wird. Aber das wörtliche "Sam O \ 'neal" erscheint als zwei Token –

Antwort

2

Ihr Muster benötigt ein Update mit einem weiteren alternativen Zweig: '[^'\\]*(?:\\.[^'\\]*)*'.

Es entsprechen:

  • ' - ein Apostroph
  • [^'\\]* - 0+ Zeichen andere als ' und \
  • (?: - eine Nicht-Erfassung Gruppe passende Sequenzen von:
    • - jede Escape-Sequenz
    • [^'\\]* - 0+ Zeichen andere als ' und \
  • )* - null oder mehr Vorkommen
  • ' - ein Apostroph

In C#:

string pattern = @"('[^'\\]*(?:\\.[^'\\]*)*'|<=|>=|!=|=|>|<|\)|\(|\s+)"; 

Siehe regex demo

C# demo:

var filter = @"abc = 'def' and size = '1 x(3"" x 5"")' and (name='Sam O\'neal')"; 
var pattern = @"('[^'\\]*(?:\\.[^'\\]*)*'|<=|>=|!=|=|>|<|\)|\(|\s+)"; 
var tokens = Regex.Split(filter, pattern).Where(x => !string.IsNullOrWhiteSpace(x)); 
foreach (var tok in tokens) 
    Console.WriteLine(tok); 

Ausgang:

abc 
= 
'def' 
and 
size 
= 
'1 x(3" x 5")' 
and 
(
name 
= 
'Sam O\'neal' 
) 
+0

Ihr Code funktioniert wie vorgesehen, aber wenn ich die Zeichenfolge zu ändern: "string filter =" abc =' def 'und size =' 1 x (3 \ " x 5 \ ") 'und (Name =' Sam O'neal ')"; '. "Sam O neal" bricht immer noch in separate Token, ich werde die Variable aus Benutzereingaben lesen. –

+0

Wie auch immer, ich habe Ihre vorherige Antwort verwendet und dann die Apostroph-Zeichenfolge behandelt, indem Sie das flüchtige Anführungszeichen in "Sam O \ 'neal" durch ein Sonderzeichen vor RegEx.Split() ersetzen und es später wieder einfügen. –

+0

@AllisonThomas 'name = 'Sam O'neal' ist es nicht möglich, ohne Annahmen übereinzustimmen. Höchstwahrscheinlich wird es durch schlechtes Design verursacht oder ist ein Fehler. –

Verwandte Themen