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

时间:2017-08-05 00:01:48

标签: c# regex split

我需要使用RegEx解析以下字符串。

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

我不确定如何将字符串保留在单引号中作为一个标记。我是Regex的新手,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您的模式需要使用另一个替代分支进行更新:'[^'\\]*(?:\\.[^'\\]*)*'

它将匹配:

  • ' - 单引号
  • [^'\\]* - 除'\
  • 以外的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'
)