Каково правильное регулярное выражение для обратной косой черты перед символом? - PullRequest
9 голосов
/ 11 сентября 2008

Допустим, я хочу представить \q (или любой другой конкретный "символ с обратной косой чертой"). То есть я хочу сопоставить \q, но не \\q, так как последний является обратным слэшем с обратной косой чертой, за которым следует q. Тем не менее, \\\q будет соответствовать, так как это обратный слэш с обратной косой чертой, за которым следует q с обратной косой чертой. (Ну, это будет соответствовать \q в конце, а не \\ в начале.)

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

Ответы [ 4 ]

17 голосов
/ 11 сентября 2008

Обновлено: Мой новый и улучшенный регулярный оператор Perl, поддерживающий более 3 обратных слэшей:

/(?<!\\)    # Not preceded by a single backslash
  (?>\\\\)* # an even number of backslashes
  \\q       # Followed by a \q
  /x;

или если ваша библиотека регулярных выражений не поддерживает расширенный синтаксис.

/(?<!\\)(?>\\\\)*\\q/

Вывод моей тестовой программы:

q does not match
\q does match
\\q does not match
\\\q does match
\\\\q does not match
\\\\\q does match

Старая версия

/(?:(?&lt;!\\)|(?&lt;=\\\\))\\q/
3 голосов
/ 11 сентября 2008

Леон Тиммерманс получил именно то, что искал. Я бы добавил одно небольшое улучшение для тех, кто придет сюда позже:

/(?<!\\)(?:\\\\)*\\q/

Дополнительная ?: в начале группы (\\\\) делает ее не сохраненной в данных о совпадениях. Я не могу представить сценарий, в котором я хотел бы сохранить текст этого сообщения.

0 голосов
/ 11 сентября 2008

Лучшее решение для этого - выполнить собственный синтаксический анализ строк, поскольку регулярные выражения на самом деле не поддерживают то, что вы пытаетесь сделать. (rep @Frank Krueger, если вы идете этим путем, я просто повторяю его совет)

Я, однако, сделал выстрел в исключительное регулярное выражение. Это будет соответствовать всем строкам, которые не соответствуют вашим критериям "\", за которым следует символ.

(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))
0 голосов
/ 11 сентября 2008

Теперь у вас две проблемы .

Просто напишите простой парсер. Если регулярное выражение сейчас завязывает вам голову, просто подождите месяц.

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