Pregunta Constantes de cadena de escape para incrustar en un estándar :: regex


C ++ 11 tiene 6 diferentes gramáticas de expresión regular que puedes usar. En mi caso, estoy interactuando con un componente que usa expresiones regulares modificadas de ECMAScript.

Necesito crear una expresión regular "unir una cadena que comience con X", donde X es un literal de cadena que tengo.

Entonces la expresión regular que quiero es aproximadamente ^X.*. Excepto que la cadena X podría contener más caracteres especiales de expresión regular, y quiero que ocurran.

Lo que significa que realmente quiero ^ escaped(X) .*.

Ahora, puedo leer la documentación de ECMAScript, encontrar todos los caracteres que tienen un significado especial, escribir una función que se les escape, y listo. Pero esto parece poco elegante, ineficiente y propenso a errores, especialmente si quiero admitir los 6 tipos de expresiones regulares que C ++ admite actualmente, y mucho menos en el futuro.

¿Hay alguna forma simple en el estándar para escapar de una cadena literal para incrustar en una expresión regular de C ++, posiblemente como una función de la gramática de expresiones regulares, o tengo que hacer mi propia?

aquí es una pregunta similar usando la biblioteca de impulso, donde la lista de escapes está codificada, y luego se genera una expresión regular que los hace una barra invertida. ¿Estoy reducido a adaptar esa respuesta para su uso en std?


8
2017-08-27 14:01


origen


Respuestas:


Si tiene que escribir el suyo, solo debe saber dos tipos.
BRE y el resto.

Estos deberían funcionar a continuación. Utilizar el ECMAScript escriba regex para operar en la cadena de entrada.

Las expresiones regulares a continuación se formulan utilizando caracteres especiales de aquí:
¿Qué caracteres especiales deben escapar en las expresiones regulares?
En respuesta Legacy RegEx Flavors (BRE/ERE) 

Ambos usan el mismo reemplazo: "\\\\$1" 

por BRE entrada:

 # "(\\\\[+?(){}|]|[.^$*\\[\\]\\\\-])"


 (                             # (1 start)
      \\ [+?(){}|]             # not sure this is needed (its not needed)
   |  
      [.^$*\[\]\\-] 
 )                             # (1 end)

por ANTES DE o ECMAScript entrada:

 # "([.^$*+?()\\[\\]{}\\\\|-])"

 ( [.^$*+?()\[\]{}\\|-] )      # (1)

Ejemplo de entrada BRE:

Antes de -

+_)(*&^%$#@!asdfasfd hello
+ ? ( ) { } |
\+ \? \( \) \{ \} \|
\\+ \\? \\( \\) \\{ \\} \\|
}{":][';/.,<>? 
here is

Después -

+_)(\*&\^%\$#@!asdfasfd hello
+ ? ( ) { } |
\\+ \\? \\( \\) \\{ \\} \\|
\\\\+ \\\\? \\\\( \\\\) \\\\{ \\\\} \\\\|
}{":\]\[';/\.,<>? 
here is

0
2017-08-27 21:21