2008-09-11 3 views
9

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

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

+0

Непонятно, что вы пытаетесь найти. Учитывая «\ n», вы хотите совместить: (1) символ новой строки, (2) последовательность «обратная косая черта, затем n», (3) последовательность «обратная косая черта, затем символ новой строки»? – 2008-09-11 13:53:13

+1

он ищет регулярное выражение, которое будет соответствовать одному символу (без пробела?), Которому предшествует номер ODD символов '\'. – 2008-09-11 13:56:03

ответ

16

Обновлено: Мой новый и улучшенный 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/ 
0

Now You Have Two Problems.

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

+0

Фрэнк, «теперь у вас есть 2 проблемы», meme - это просто шутка программиста (ламе?). RegExps имеют плохую печать из-за всех идиотов, которые используют ее для HTML и XML. В противном случае это законный инструмент, если анализируемый контент будет http://en.wikipedia.org/wiki/Regular_language. Какая «бездна обратная косая черта» оказывается ... – 2014-09-25 06:56:11

-1

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

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

(?:[\\][\\])(?!(([\\](?![\\])[a-zA-Z]))) 
3

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

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

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

Смежные вопросы