我正在努力使这个正则表达式模式完全正确,如果有人有更好的选择,我愿意接受正则表达式之外的其他选项。
情况:
我主要是想针对 C# 中的文本列解析 T-SQL“in”子句。所以,我需要像这样取一个字符串值:
“‘不要’、‘做’、‘任何事情’、‘愚蠢’”
并将其解释为值列表(稍后我会处理双引号):
“不要”
“做”
“任何”
“愚蠢”
我有一个适用于大多数情况的正则表达式,但我正在努力将其推广到可以接受我组内的任何字符或双引号的地步:(?:')( [a-z0-9\s(?:'(?='))]+)(?:')[,\w]*
我对正则表达式相当有经验,但很少(如果有的话)发现需要环顾四周(因此相应地降低我对正则表达式体验的评估)。
因此,换句话说,我想获取一串以逗号分隔的值,每个值都包含在单引号中但可以包含双单引号,并输出每个这样的值。
编辑 这是我当前正则表达式的一个无效示例(我的问题是我需要处理分组中的所有字符,并在遇到单引号后没有跟第二个单引号时停止):
“‘不要’、‘做?’、‘任何事情!’、‘#stupid$’”
最佳答案
如果您仍然考虑基于正则表达式的解决方案,则可以使用以下正则表达式:
'(?:''|[^'])*'
或@sln 建议的“展开”版本:
'[^']*(?:''[^']*)*'
参见 demo
它相当简单,它捕获双单引号或任何不是单引号的内容。无需使用任何后视或前视。它不处理任何逃脱的实体,但我在你的问题中没有看到这个要求。
此外,此正则表达式将返回易于访问和处理的匹配项:
var text = "'don''t', 'do', 'anything', 'stupid'";
var re = new Regex(@"'[^']*(?:''[^']*)*'"); // Updated thanks to @sln, previous (@"'(?:''|[^'])*'");
var match_values = re.Matches(text).Cast<Match>().Select(p => p.Value).ToList();
输出:
关于c# - 检测单引号内的两个连续单引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307386/