C#正则表达式提取字符串括在单引号

问题描述:

我有我需要使用RegEx解析以下字符串。C#正则表达式提取字符串括在单引号

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

这是一个SQL滤波器,我想分成使用以下分离器的令牌,其中:该字符串被解析

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

后,我想输出是:

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

我试过下面的代码:

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

我不确定如何将单引号中的字符串保留为一个令牌。我是新来的正规表达,并会感谢任何帮助。

+1

后'(''添加 '[^'] *'|'。 –

+0

Thanks @WiktorStribiżew - 我尝试了以下模式的建议:'string pattern = @“( = |!= | = |> |

您的模式需要另一个备选分支的更新:'[^'\\]*(?:\\.[^'\\]*)*'

它将匹配:

  • ' - 单引号
  • [^'\\]* - 0+字符比'\
  • (?:其他 - 非捕获组匹配的序列:
    • \\. - 任何转义序列
    • [^'\\]* - 和0+字符比'其他\
  • )* - 零个或多个
  • ' - 单引号

在C#:

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

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); 

输出:

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

您的代码按照提供的方式工作,但如果将字符串更改为:'string filter ='abc ='def'and size ='1 x(3 \“ x 5 \“)'和(name ='Sam O'neal')”; '。 “Sam O neal”仍然分成单独的标记,我将从用户输入读取变量。 –

+0

无论如何,我已经使用过你的回答,然后通过用RegEx.Split()之前的特殊字符替换“Sam O \'neal”中的转义单引号,然后再将其放回来来处理撇号字符串。 –

+0

@AllisonThomas'name ='Sam O'neal''不可能没有假设匹配。最有可能的是,这是由于设计不佳或者是错误造成的。 –