Como escapar de um colchete para o Padrão de compilação
-
16-09-2019 - |
Pergunta
Eu tenho uma lista separada por vírgulas de expressões regulares:
.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]
Eu fiz uma divisão em ponto e vírgula.Agora estou tentando corresponder a este regex contra uma senha gerada.O problema é que Pattern.compile
não gosta de colchetes que não é ignorado.Pode por favor me dar uma simples função que recebe uma string assim: [0-9]
e retorna o escapado da cadeia \[0-9\]
.
Solução
Você pode usar Pattern.quote(String)
.
A partir do google docs:
public static String quote(String s)
Retorna um literal padrão
String
para o especificadoString
.Este método produz uma Seqüência de caracteres que pode ser usado para criar um Padrão que iria coincidir com a seqüência s, como se fosse um literal padrão.
Meta-caracteres ou sequências de escape na seqüência de entrada será dado nenhum significado especial.
Outras dicas
Por alguma razão, a resposta acima não funcionou para mim. Para aqueles como eu que vêm depois, aqui está o que eu encontrei.
Eu esperava que uma única barra de barro escape do suporte, no entanto, você deve usar dois se tiver o padrão armazenado em uma string. A primeira barra de barragem escapa a segunda na corda, para que o que Regex vê é \]
. Como Regex apenas vê uma barra de barriga, ele a usa para escapar do suporte quadrado.
\\]
Em Regex, isso corresponderá a um único suporte quadrado de fechamento.
Se você está tentando corresponder a uma nova linha, por exemplo, você usaria apenas uma única barra de barriga. Você está usando o padrão de escape de string para inserir um caractere novo na string. Regex não vê \n
- Ele vê o personagem Newline e corresponde a isso. Você precisa de duas barras de barriga, porque não é uma sequência de escape de cordas, é uma sequência de escape regex.
Você pode usar os caracteres q e e e especiais ... qualquer coisa entre q e e é escape automaticamente.
\Q[0-9]\E
Pattern.compile()
Gosta de suportes quadrados muito bem. Se você pegar a corda
".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"
E dividi-lo em vírgulas, você acaba com cinco regexes perfeitamente válidos: o primeiro corresponde a oito caracteres não-vendidos, o segundo corresponde a um dígito ASCII e assim por diante. A menos que você realmente queira combinar strings como ".{8}"
e "[0-9]"
, Não vejo por que você precisaria escapar de qualquer coisa.