Я ищу регулярное выражение, которое может извлекать цитируемые разделы в строке, как одинарные, так и двойные кавычки.
IE:
"This is 'an example', \"of an input string\""
Спички:
Я написал это:
[\"|'][A-Za-z0-9\\W]+[\"|']
Он работает, но кто-нибудь видит в нем недостатки?
Обновлено: Основная проблема, которую я вижу, заключается в том, что он не может обрабатывать вложенные кавычки.
Я думаю, вы имеете в виду [\ "'], потому что [\" |'] будет соответствовать | (труба) тоже. Вам не нужно использовать вертикальную черту для выражения «или» в квадратных скобках.
Разве это не позволяет использовать одинарную кавычку в начале и двойную кавычку в конце или наоборот, а также одну и ту же кавычку в начале и в конце.
<stackoverflow.com/questions/171480/…> Конкретно эти ответы: <stackoverflow.com/questions/171480/…> <stackoverflow.com/questions/171480/…>





Он работает, но не соответствует другим символам в кавычках (например, не буквенно-цифровым, как двоичные символы или символы иностранного языка). Как насчет этого:
[\"']([^\"']*)[\"']
Мое регулярное выражение C# немного заржавело, так что полегче со мной, если это не совсем так :)
Это вообще не возвращает никаких совпадений.
Я изменил его, чтобы использовать скобки вместо [], так как я думаю, что точка считалась буквальной точкой, а не подстановочным знаком. Я протестировал его на Ruby с вашим примером строки, и, похоже, он им подходит.
Но жадный старт перебирает любые цитаты, и вы получите самое длинное совпадение, но не правильное.
В этом случае первое совпадение также содержит остаток строки в моей тестовой строке
ах, я пропустил это. это регулярное выражение, кажется, работает лучше: просто запишите все, что не является цитатой
Как это?
"([\"'])(.*?)\1"
Ваше желаемое совпадение будет в подгруппе 2, а тип цитаты - в первой группе.
Недостаток вашего регулярного выражения: 1) жадный "+" и 2) [A-Za-z0-9] на самом деле не очень много соответствует. Многие символы не попадают в этот диапазон.
Я думаю, вы имеете в виду «\ 1», а не «$ 1».
Это уже исправлено. Иногда я немного путаю диалекты регулярных выражений, «$ 1» - это обратная ссылка на реализацию регулярного выражения VBScript.
Как он обрабатывает одинарные кавычки внутри двойных кавычек (или наоборот)?
"This is 'an example', \"of 'quotes within quotes'\""
должен соответствовать
Используйте обратную ссылку, если вам нужно это поддержать.
(\"|')[A-Za-z0-9\\W]+?\1
Обновлено: исправлено использование неохотного квантификатора.
Это не работает для таких строк: "foo foo \" match \ "foo \" match \ "foo", где оно возвращает "\" match \ "foo \" match \ "" как единственное совпадение.
Это потому, что \ W - это класс символов без слов, а не класс пробелов, как я думал. Моя память не та, что была раньше.
Нет. :-) Это потому, что "+" жадно совпадает с концом строки до того, как произойдет возврат с возвратом, и последняя применимая кавычка дается обратной ссылке "\ 1".
И если на то пошло, с "\ s", который у вас теперь есть, он не будет соответствовать пунктуации, диакритическим символам, греческим символам и т. д.
Ладно, это моя вина. Я неправильно понял, что должно было быть сопоставлено. Я думал, что это совпадение букв, цифр и пробелов. Так что переход на неохотный квантификатор - вот вам билет.
@"(\"|')(.*?)\1"
Возможно, у вас уже есть один из них, но, если нет, вот бесплатный инструмент с открытым исходным кодом, который я все время использую для тестирования своих регулярных выражений. Обычно у меня есть общее представление о том, как должно выглядеть выражение, но мне нужно повозиться с некоторыми частностями.
Регулярное выражение, которое вы даете, похоже, совсем не соответствует вашей строке примера. А как насчет пробелов внутри кавычек?