Совпадение с неравным количеством escape-символов - PullRequest
3 голосов
/ 03 мая 2009

Мне нужно сопоставить операторы препроцессора 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, но я был бы признателен за ответы в any Regex vernacular.)

1 Ответ

5 голосов
/ 03 мая 2009

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

/
  (?<!\\)    # not preceded by a backslash
  (?:\\\\)*  # zero or more escaped backslashes
  \\ \n      # single backslash and linefeed
/x
...