【问题标题】:C# regex extract string enclosed into single quotesC#正则表达式提取字符串括在单引号中
【发布时间】:2018-01-12 23:49:45
【问题描述】:

我需要使用 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 的新手,希望能提供任何帮助。

【问题讨论】:

  • (之后添加'[^']*'|
  • 谢谢@WiktorStribiżew - 我用以下模式尝试了你的建议:'string pattern = @"(=|!=|=|>|

标签: c# regex split


【解决方案1】:

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

它将匹配:

  • ' - 单引号
  • [^'\\]* - 除了 '\ 之外还有 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'
)

【讨论】:

  • 您的代码按照提供的方式工作,但如果我将字符串更改为:string filter = "abc = 'def' and size = '1 x(3\" x 5\")' and (name='Sam O'neal')"; 。 “Sam O neal”仍然会分成不同的标记,我将从用户输入中读取变量。
  • 无论如何,我已经使用了您以前的答案,然后通过在 RegEx.Split() 之前用特殊字符替换“Sam O\'neal”中的转义单引号来处理撇号字符串,然后将其放入稍后回来。
  • @AllisonThomas name='Sam O'neal' 在没有假设的情况下是不可能匹配的。很可能是由于设计不当或错误造成的。
  • @AllisonThomas:如果您设法根据我的回答找到解决方案,请考虑接受。
  • 感谢@WiktorStribizew,非常感谢您的帮助。我接受了你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 2018-01-25
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多