Обновленный: Мой новый и улучшенный 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/
Leon Timmermans получил точно, что я искал. Я добавил бы одно маленькое улучшение для тех, кто приезжает сюда позже:
/(?<!\\)(?:\\\\)*\\q/
Дополнительное ?:
в начале (\\\\)
группа делает его не сохраненным в любые данные соответствия. Я не могу вообразить сценарий, где я хотел бы текст сохраненного.
Теперь у Вас есть две проблемы.
Просто запишите простой синтаксический анализатор. Если regex ставит Вашу голову в затруднительное положение теперь, просто ожидайте месяц.
Лучшее решение этого состоит в том, чтобы сделать Вашу собственную строку, анализирующую, поскольку Регулярные выражения действительно не поддерживают то, что Вы пытаетесь сделать. (представитель @Frank Krueger, если Вы идете этим путем, я просто повторяю его совет),
Я действительно однако брал выстрел в исключающий regex. Это будет соответствовать всем строкам, которые не соответствуют Вашим критериям "\" сопровождаемый символом.
(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z])))