Regexp Question - Отрицание захваченного персонажа - PullRequest
1 голос
/ 26 августа 2010

Я ищу регулярное выражение, которое допускает строки, заключенные в одинарные или двойные кавычки, и допускает использование символа противоположной кавычки в строке. Например, следующие строки могут быть допустимыми: "Привет" там "мир" «Привет, мир!»

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

(['"])(?:(?!\1).)*\1

Я думаю, это сработает, но что если язык не поддерживает негативную перспективу? Есть ли другой способ сделать это? Без чередования?

EDIT:

Я знаю, что могу использовать чередование. Это был больше просто гипотетический вопрос. Скажем, у меня было 20 разных персонажей в начальном классе персонажей. Я бы не хотел выписывать 20 разных вариантов. Я пытаюсь на самом деле отрицать захваченного персонажа, не используя взгляд, взгляд назад или чередование.

Ответы [ 3 ]

7 голосов
/ 26 августа 2010

Это на самом деле намного проще, чем вы могли себе представить.Вам действительно не нужен негативный прогноз.То, что вы хотите сделать - это не жадное (или ленивое) совпадение, подобное этому:

(['"]).*?\1

Символ ? после .* является важной частью.Он говорит, потребляйте как можно меньше символов, прежде чем перейти к следующей части регулярного выражения.Таким образом, вы получаете любой вид цитаты, а затем вы идете после 0-M символов, пока не встретите символ, соответствующий той цитате, с которой вы впервые столкнулись.Вы можете узнать больше о жадном сопоставлении с не жадным здесь и здесь .

1 голос
/ 26 августа 2010

В общем случае регулярные выражения на самом деле не являются ответом. Возможно, вас заинтересует что-то вроде Text :: ParseWords , которое токенизирует текст, учитывает вложенные кавычки, обратные слэши, пробелы и другие странности.

1 голос
/ 26 августа 2010

Sure:

'([^']*)'|"([^"]*)"

При успешном совпадении переменная $+ будет содержать содержимое любого альтернативного совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...