使用Regex将带引号的字符串与嵌入的非转义引号相匹配

时间:2011-10-09 19:11:58

标签: 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);
    Console.WriteLine(match.Groups[1].Captures[0]);
 }

这正确匹配“Emma”和“The Last leaf”,但第三场比赛是“Gulliver”。但理想的比赛是“格列佛的旅行”。我如何为这样的模式构建正则表达式?

4 个答案:

答案 0 :(得分:4)

由于,是您的分隔符,您可以尝试更改此模式。它应该工作。

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

这种方式的工作方式是,它会查找单引号后跟逗号或行尾。

答案 1 :(得分:2)

我认为这可以作为正则表达式使用'(.*?)',|'(.*)'

答案 2 :(得分:1)

您可以考虑使用后视/向前看:

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

使用grep进行测试

kent$  echo "'Emma','The Last Leaf','Gulliver's travels'"|grep -Po "(?<=^'|',').*?(?='$|',')"
Emma
The Last Leaf
Gulliver's travels

答案 3 :(得分:0)

你不能,如果你有单引号分隔的字符串而Gulliver's包含一个未转义的引号,则无法将其与字符串的结尾区分开来。您可以随时用逗号分隔它并从任意一侧修剪'但我不确定这是您想要的:

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

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