Pregunta

Necesito hacer coincidir las declaraciones del preprocesador de C ++. Ahora, las declaraciones del preprocesador pueden abarcar varias líneas:

#define foobar \
    "something glorious"

Esta barra invertida final se puede escapar, por lo que los siguientes resultados en dos líneas separadas:

#define foobar \\
No longer in preprocessor.

La pregunta es cómo puedo hacer coincidir eficientemente la continuación de línea explícita. Tengo la siguiente expresión que creo que creo funciona. Básicamente, prueba si el número de barras invertidas es impar. ¿Es esto correcto? ¿Se puede hacer de manera más eficiente?

/
    [^\\]           # 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

(Estoy usando PHP, por lo que se aplican las reglas PCRE, pero agradecería las respuestas en any Regex vernáculo.)

¿Fue útil?

Solución

Creo que lo estás haciendo más difícil de lo que debe ser. Prueba esto:

/
  (?<!\\)    # not preceded by a backslash
  (?:\\\\)*  # zero or more escaped backslashes
  \\ \n      # single backslash and linefeed
/x
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top