Использование Regex для сопоставления строки в кавычках со встроенными, неэкранированными кавычками - PullRequest
2 голосов
/ 09 октября 2011

Я пытаюсь сопоставить строку в следующем шаблоне с регулярным выражением.

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

Это правильно сопоставляет "Эмму" и "Последний лист", однако третье совпадение - "Гулливер".Но желаемый матч - «путешествия Гулливера».Как я могу построить регулярное выражение для таких шаблонов?

Ответы [ 4 ]

4 голосов
/ 09 октября 2011

Поскольку , является вашим разделителем, вы можете попробовать изменить свой шаблон следующим образом. Это должно работать.

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

То, как это работает, ищет одиночную кавычку, за которой следует запятая или конец строки.

2 голосов
/ 09 октября 2011

Я думаю, что это может работать '(.*?)',|'(.*)' как регулярное выражение.

1 голос
/ 09 октября 2011

вы можете рассмотреть возможность использования оглядки назад / заглядывания в будущее:

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

тест с grep :

kent$  echo "'Emma','The Last Leaf','Gulliver's travels'"|grep -Po "(?<=^'|',').*?(?='$|',')"
Emma
The Last Leaf
Gulliver's travels
0 голосов
/ 09 октября 2011

Вы не можете, если у вас есть строки, разделенные одинарными кавычками, а Gulliver's содержит одну неэкранированную кавычку, ее невозможно отличить от конца строки.Вы всегда можете просто разделить его запятыми и обрезать ' s с любой стороны, но я не уверен, что вы хотите:

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

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