Lista de todos os caracteres especiais que precisam ser escapados em um regex

Estou tentando criar um aplicativo que corresponda a um modelo de mensagem com uma mensagem que um usuário está tentando enviar. Eu estou usando o Java regex para combinar a mensagem. O modelo / mensagem pode conter caracteres especiais.

Como eu obteria a lista completa de caracteres especiais que precisam ser escapados para que meu regex funcione e corresponda no máximo de casos possíveis?

Existe uma solução universal para escaping todos os caracteres especiais em regex Java?

Você pode ver o javadoc da class Pattern: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Você precisa escaping de qualquer char listado lá se você quiser o char regular e não o significado especial.

Como uma solução talvez mais simples, você pode colocar o modelo entre \ Q e \ E – tudo entre eles é considerado como escapado.

  • Os caracteres Java que precisam ser escapados em expressões regulares são:
    \.[]{}()<>*+-=?^$|
  • Dois dos colchetes de fechamento ( ] e } ) precisam ser escapados somente após a abertura do mesmo tipo de suporte.
  • Em [] -brackets, alguns caracteres (como + e - ) às vezes funcionam sem escape.

Para escaping, você poderia usar isso do Java 1.5 :

 Pattern.quote("$test"); 

Você vai combinar exatamente a palavra $test

De acordo com a página de documentação String Literais / Metacaracteres , eles são:

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

Também seria legal ter essa lista referenciada em algum lugar no código, mas eu não sei onde isso poderia ser …

Na sugestão de @Sorin dos documentos do Java Pattern, parece que os chars para escaping são pelo menos:

 \.[{(*+?^$| 

Combinando o que todos disseram, eu proponho o seguinte, manter a lista de caracteres especiais para o RegExp claramente listada em sua própria String, e evitar ter que tentar analisar visualmente milhares de “\\”. Isso parece funcionar muito bem para mim:

 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"); } 

do outro lado da moeda, você deve usar regex “não-char” que se parece com isso se caracteres especiais = allChars – number – ABC – espaço no contexto do seu aplicativo.

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

Não tenho certeza se entendi completamente sua pergunta, mas acho que você deve analisar o Matcher.quoteReplacement ()