C# 使用正则表达式将带引号的字符串与嵌入的非转义引号匹配

C# 使用正则表达式将带引号的字符串与嵌入的非转义引号匹配,c#,.net,regex,escaping,quotes,C#,.net,Regex,Escaping,Quotes,我正在尝试将以下模式中的字符串与正则表达式匹配 string text = "'Emma','The Last Leaf','Gulliver's travels'"; string pattern = @"'(.*?)',?"; foreach (Match match in Regex.Matches(text,pattern,RegexOptions.IgnoreCase)) { Console.WriteLine(match + " " + match.Index);

我正在尝试将以下模式中的字符串与正则表达式匹配

string text = "'Emma','The Last Leaf','Gulliver's travels'";
string pattern = @"'(.*?)',?";

foreach (Match match in Regex.Matches(text,pattern,RegexOptions.IgnoreCase))
 {
    Console.WriteLine(match + " " + match.Index);
    Console.WriteLine(match.Groups[1].Captures[0]);
 }

这与“Emma”和“Last leaf”匹配正确,但第三个匹配是“格列佛”。但理想的匹配是《格列佛游记》。我如何为这样的模式构建正则表达式?

你不能,如果你有单引号分隔的字符串,而格列佛的
包含一个单引号,没有任何方法将其与字符串的结尾区分开来。您总是可以用逗号将其拆分,然后从两边修剪
,但我不确定这是否是您想要的:

string text = "'Emma','The Last Leaf','Gulliver's travels'";

foreach(string s in text.split(new char[] {','})) {
    Console.WriteLine(s.Trim('\''));
}

我认为这可以像正则表达式一样工作。

因为
是您的分隔符,您可以尝试这样更改您的模式。它应该会起作用

string pattern = @"'(.*?)'(?:,|$)"; 

这样的方法是,找一个引号,后面跟着逗号或结尾。

你可以考虑使用后面/向前看:

 "(?<=^'|',').*?(?='$|',')"

”(?这更像是语言上的问题:)如果你在输入字符串中添加一个逗号,你可以去掉导致错误匹配的
,?
中的
。你没有办法得到正确转义的输入字符串吗?如果这本书实际上被命名为
《格列佛游记》,你会怎么做“
?您可以使用平衡分组()处理嵌套字符。但是,嵌套字符并不是最糟糕的问题。真正的问题是格列佛的
中的撇号没有被转义。这使得解析器的规则很难定义。@Steve:我认为撇号就是OP所说的,而这根本不是嵌套。我从标题中删除了“嵌套”一词。从技术上讲,它可以与字符串结尾区分开来,因为引号后面没有逗号,或者是输入中的最后一个字符。:)@bzlm:我想你有自己的答案:)用LINQPad()试试看——它有用吗?如果格列佛的旅行是第一个呢?我用expresso()检查了两个版本(格列佛在结尾/开头)似乎都有效,因为交替是有序的。它总是先尝试
“(.*?”,
,然后匹配除最后一项之外的所有项,而不考虑嵌入的撇号。非常优雅,真的。顺便说一句,如果您将其更改为
'(?*?),|'(?*)
,您可以通过
组[“title”]
检索所需的部分,而不必使用程序逻辑来确定匹配的是哪个组。不知何故错过了expresso的建议。这是一个有用的小工具。感谢esunar+1,因为它“在这里工作”,但请参阅bzlm(可能很傻;-)的反例:
“Emma”、“最后一片叶子”、“格列佛”,“s travels”
——请记住,正则表达式是相对脆弱的。@pst OP的要求是匹配位于两个单引号之间的字符串部分,并且每个字符串仅用逗号分隔。据我所知,
是这里唯一的救援。否则,正如您所说,此任务需要一个复杂(或不可能)的正则表达式。在您给出的文本上应用上述正则表达式将得到预期的输出
Emma
最后一片叶子
格列佛
,以及无意义的
s旅行
+1。只要您正在解析的字符串没有超出我们已经看到的逗号和撇号的奇怪组合,那么这就足够了。
kent$  echo "'Emma','The Last Leaf','Gulliver's travels'"|grep -Po "(?<=^'|',').*?(?='$|',')"
Emma
The Last Leaf
Gulliver's travels