Каково надлежащее регулярное выражение для незавершенной обратной косой черты перед символом?

9
задан James A. Rosen 11 September 2008 в 13:48
поделиться

4 ответа

Обновленный: Мой новый и улучшенный Perl regex, поддерживая больше чем 3 обратных косых черты:

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

или если Ваша regex библиотека не поддерживает расширенный синтаксис.

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

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

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

Более старая версия

/(?:(?<!\\)|(?<=\\\\))\\q/
17
ответ дан 4 December 2019 в 11:09
поделиться

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

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

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

3
ответ дан 4 December 2019 в 11:09
поделиться

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

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

0
ответ дан 4 December 2019 в 11:09
поделиться

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

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

(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))
-1
ответ дан 4 December 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: