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));
我不确定如何将单引号中的字符串保留为一个令牌。我是新来的正规表达,并会感谢任何帮助。
您的模式需要另一个备选分支的更新:'[^'\\]*(?:\\.[^'\\]*)*'
。
它将匹配:
-
'
- 单引号 -
[^'\\]*
- 0+字符比'
和\
-
(?:
其他 - 非捕获组匹配的序列:-
\\.
- 任何转义序列 - 个
[^'\\]*
- 和0+字符比'
其他\
-
-
)*
- 零个或多个 -
'
- 单引号
在C#:
string pattern = @"('[^'\\]*(?:\\.[^'\\]*)*'|<=|>=|!=|=|>|<|\)|\(|\s+)";
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'
)
您的代码按照提供的方式工作,但如果将字符串更改为:'string filter ='abc ='def'and size ='1 x(3 \“ x 5 \“)'和(name ='Sam O'neal')”; '。 “Sam O neal”仍然分成单独的标记,我将从用户输入读取变量。 –
无论如何,我已经使用过你的回答,然后通过用RegEx.Split()之前的特殊字符替换“Sam O \'neal”中的转义单引号,然后再将其放回来来处理撇号字符串。 –
@AllisonThomas'name ='Sam O'neal''不可能没有假设匹配。最有可能的是,这是由于设计不佳或者是错误造成的。 –
后'(''添加 '[^'] *'|'。 –
Thanks @WiktorStribiżew - 我尝试了以下模式的建议:'string pattern = @“( = |!= | = |> |