Совпадение с неравным количеством escape-символов

StackOverflow https://stackoverflow.com/questions/816915

  •  03-07-2019
  •  | 
  •  

Вопрос

Мне нужно сопоставить операторы препроцессора C ++. Теперь операторы препроцессора могут занимать несколько строк:

#define foobar \
    "something glorious"

Эта последняя обратная косая черта может быть экранирована, поэтому следующие результаты в двух отдельных строках:

#define foobar \\
No longer in preprocessor.

Вопрос в том, как эффективно сопоставить явное продолжение строки. У меня есть следующее выражение, которое, как мне кажется, работает . По сути, он проверяет, является ли количество обратных косых черт нечетным. Это правильно? Можно ли сделать это более эффективно?

/
    [^\\]           # Something that's not an escape character, followed by …
    (?<escape>\\*?) # … any number of escapes, …
    (?P=escape)     # … twice (i.e. an even number).
    \\ \n           # Finally, a backslash and newline.
/x

(Я использую PHP, поэтому применяются правила PCRE, но я буду признателен за ответы на любом регулярном языке Regex.)

Это было полезно?

Решение

Я думаю, ты делаешь это сложнее, чем нужно. Попробуйте это:

/
  (?<!\\)    # not preceded by a backslash
  (?:\\\\)*  # zero or more escaped backslashes
  \\ \n      # single backslash and linefeed
/x
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top