Pregunta Lista de todos los caracteres especiales que deben escaparse en una expresión regular


Intento crear una aplicación que coincida con una plantilla de mensaje con un mensaje que un usuario está intentando enviar. Estoy usando Java Regex para hacer coincidir el mensaje. La plantilla / mensaje puede contener caracteres especiales.

¿Cómo obtendría la lista completa de los caracteres especiales que deben escaparse para que mi expresión regular funcione y coincida en el máximo de casos posibles?

¿Existe una solución universal para escapar de todos los caracteres especiales en Java regex?


75
2018-01-03 07:14


origen


Respuestas:


Puedes mirar el javadoc de la clase Pattern: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Necesitas escapar de cualquier char enumerado allí si quieres el carácter normal y no el significado especial.

Como una solución quizás más simple, puede colocar la plantilla entre \ Q y \ E: todo lo que se encuentre entre ellos se considera como escapado.


62
2018-01-03 07:44



  • Los caracteres Java que deben escaparse en expresiones regulares son:
    \.[]{}()<>*+-=?^$|
  • Dos de los corchetes de cierre (] y }) solo necesitan escaparse después de abrir el mismo tipo de soporte.
  • En []-brackets algunos personajes (como + y -) a veces funcionan sin escape.

60
2017-10-07 05:03



Para escapar podrías usar esto de Java 1.5:

Pattern.quote("$test");

Coincidirás exactamente con la palabra $test


17
2018-05-13 18:02



De acuerdo con la Literales de cuerda / Metacaracteres página de documentación, son:

<([{\^-=$!|]})?*+.>

También sería genial tener esa lista arbitrada en algún lugar del código, pero no sé dónde podría estar ...


14
2017-12-13 00:53



Según la sugerencia de @Sorin de los documentos de Java Pattern, parece que los caracteres para escapar son al menos:

\.[{(*+?^$|

5
2018-02-12 04:17



Combinando lo que todos dijeron, propongo lo siguiente, mantener la lista de caracteres especiales para RegExp claramente enumerados en su propio String, y evitar tener que intentar analizar visualmente miles de "\\". Esto parece funcionar bastante bien para mí:

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");

String quoteRegExSpecialChars( String s)
{
    Matcher m = reCharsREP.matcher( s);
    return m.replaceAll( "\\\\$0");
}

4
2018-04-01 06:22



en el otro lado de la moneda, debe usar la expresión regular "sin charla" que se ve así si hay caracteres especiales = allChars - número - ABC - espacio en el contexto de su aplicación.

String regepx = "[^\\s\\w]*";

1
2018-01-03 07:39