O Java possui uma maneira integrada de escapar de texto arbitrário para que ele possa ser incluído em uma expressão regular? Por exemplo, se meus usuários digitarem "$ 5", gostaria de corresponder exatamente isso ao invés de um "5" após o final da entrada.
320
\Q
e\E
. Isso pode levar a resultados inesperados, por exemploPattern.quote("*.wav").replaceAll("*",".*")
, resultará\Q.*.wav\E
e não.*\.wav
, conforme o esperado."mouse".toUpperCase().replaceAll("OUS","ic")
isso retornaráMicE
. Você would't esperar que voltarMICE
porque você não se aplicavatoUpperCase()
noic
. No meu exemploquote()
é aplicado no.*
insertetreplaceAll()
também. Você tem que fazer outra coisa, talvez.replaceAll("*","\\E.*\\Q")
funcione, mas isso é contra-intuitivo.*.wav
o padrão regex\*\.wav
e o replaceAll o transformaria\.*\.wav
, o que significa que seria corresponde aos arquivos cujo nome consiste em um número arbitrário de períodos seguidos por.wav
. Você provavelmente precisariareplaceAll("\\*", ".*")
se eles tivessem adotado a implementação mais frágil que depende do reconhecimento de todos os possíveis caracteres regex ativos e escapando deles individualmente ... isso seria muito mais fácil?Diferença entre
Pattern.quote
eMatcher.quoteReplacement
não estava clara para mim antes de ver o exemplo a seguirfonte
Pattern.quote
substitui caracteres especiais em cadeias de caracteres de pesquisa de expressões regulares, como. | + () Etc, eMatcher.quoteReplacement
substitui caracteres especiais em cadeias de caracteres de substituição, como \ 1 para referências anteriores.quoteReplacement
apenas se preocupa com os dois símbolos$
e\
que pode, por exemplo, ser usado em cadeias de substituição como referências posteriores$1
ou\1
. Portanto, não deve ser usado para escapar / citar um regex.$Group$
comT$UYO$HI
. O$
símbolo é especial tanto no padrão como na substituição:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
Pode ser tarde demais para responder, mas você também pode usar
Pattern.LITERAL
, o que ignoraria todos os caracteres especiais durante a formatação:fonte
Pattern.CASE_INSENSITIVE
Eu acho que você está procurando
\Q$5\E
. Veja tambémPattern.quote(s)
introduzido no Java5.Consulte javadoc padrão para obter detalhes.
fonte
Primeiro, se
não colocará 1 no final. Ele examinará o regex de pesquisa do primeiro grupo e sub-grupo correspondente. É isso que $ 1, $ 2 ou $ 3 significa no texto de substituição: grupos correspondentes do padrão de pesquisa.
Freqüentemente, plugue longas seqüências de texto em arquivos .properties e depois gero assuntos e corpos de email a partir deles. De fato, essa parece ser a maneira padrão de executar o i18n no Spring Framework. Coloco marcas XML, como espaços reservados, nas seqüências de caracteres e uso replaceAll () para substituir as marcas XML pelos valores em tempo de execução.
Encontrei um problema em que um usuário inseria uma figura de dólares e centavos, com um cifrão. replaceAll () engasgou, com o seguinte aparecendo em um stracktrace:
Nesse caso, o usuário digitou "$ 3" em algum lugar da entrada e replaceAll () foi procurar no regex de pesquisa o terceiro grupo correspondente, não encontrou um e vomitou.
Dado:
substituindo
com
resolveu o problema. O usuário pode inserir qualquer tipo de caractere, incluindo cifrões, sem problemas. Ele se comportou exatamente da maneira que você esperaria.
fonte
Para ter um padrão protegido, você pode substituir todos os símbolos por "\\\\", exceto dígitos e letras. E depois disso, você pode colocar nesse padrão protegido seus símbolos especiais para fazer com que esse padrão funcione não como um texto citado estúpido, mas realmente como um padrão, mas o seu. Sem símbolos especiais do usuário.
fonte
Pattern.quote ("blabla") funciona bem.
O Pattern.quote () funciona bem. Inclui a frase com os caracteres " \ Q " e " \ E " e, se escapar, "\ Q" e "\ E". No entanto, se você precisar fazer uma expressão regular real como escape (ou escape personalizado), poderá usar este código:
Este método retorna: Some / \ s / wText * / \, **
Código por exemplo e testes:
fonte
^ O símbolo (negação) é usado para corresponder a algo que não está no grupo de caracteres.
Este é o link para Expressões regulares
Aqui estão as informações da imagem sobre negação:
fonte