Primeiro, vamos resumir os usos dos três:
・ Substitua (alvo de Charsequence, substituição de Charsequence) , substitua todos os alvos pela substituição, ambos os parâmetros são strings.
・ ReplacEall (String regex, substituição da string) , substitua todas as correspondências regex pela substituição. Regex é obviamente uma expressão regular, a substituição é uma string.
・ Substituirfirst (String regex, substituição de string) , que é basicamente o mesmo que o replacEall, a diferença é que apenas a primeira correspondência é substituída.
Em seguida, existe um requisito simples, que é substituir uma na sequência de origem por /a, o código é o seguinte:
System.out.println ("abac" .Rearplace ("A", "// A")); ///ab/acsystem.out.println("abac".replaceall("a "," // a ")); //abacsystem.out.println("abac".replacefirst("a "," // a ")); //abacsystem.out.println("abac".replacefirst("a "," // a ")); // ABACO resultado foi uma grande surpresa. Depois de tantos anos de substituição, fiquei um pouco confuso.
A sequência de origem é "ABAC" e, em seguida, encontramos "A", substitua -a por /a. Como /é um personagem Java Escape, se você deseja expressar /a, deve escrever "// A", a primeira barra de barragem escapa a segunda barragem em uma string normal.
Com três expressões de substituição, apenas o resultado da primeira função de substituição está correto. Qual é o problema?
ReplaceAll e Substituirfirst exigem que o primeiro parâmetro seja uma expressão regular. "A" pode ser entendido como a sequência A e a expressão regular A, portanto o primeiro parâmetro é bom.
O problema está no segundo parâmetro. Se os leitores lerem cuidadosamente os comentários da função Replaceall, eles encontrarão a seguinte explicação:
Observe que as barras (/) e os sinais de dólar ($) na sequência de substituição podem fazer com que os resultados sejam diferentes do que se estivesse sendo tratada como uma corda de substituição literal; Veja Matchaer.Replaceall. Use java.util.regex.matcher.quotereplacement para suprimir o significado especial desses caracteres, se desejado.
Como o primeiro parâmetro do ReplaceAll e Replicação é regular, podemos fazer alguns pequenos truques no segundo parâmetro, como um requisito: substitua uma na sequência de origem pelo caractere imediatamente após a, o código é o seguinte:
System.out.println ("abac" .replaceall ("a (// w)", "$ 1 $ 1")); //bbccsystem.out.println("abac".replacefirst("a(//w) "," $ 1 $ 1 ")); // bbacSuponha que o significado da regularidade possa ser entendido pelo leitor, pode -se ver que, no segundo parâmetro, o símbolo $ pode ser usado para obter o conteúdo do grupo. Neste exemplo, US $ 1 é usado para obter o conteúdo do primeiro grupo, ou seja, o personagem imediatamente após a.
Portanto, o símbolo $ tem um significado especial no segundo parâmetro e escrevê -lo aleatoriamente causará um erro:
System.out.println ("abac" .replaceall ("a (// w)", "$")); // Exceção no thread "Main" java.lang.stringIndexoutOfBoundSexception: String índice fora do intervalo: 1E se eu quiser apenas substituí -lo por $? Isso requer caracteres que escapam:
System.out.println ("ABAC" .Replaceall ("A", "// $")); // $ B $ cNesse ponto, os leitores podem de repente perceber que a barra de barriga também tem um significado especial (escapado) no segundo parâmetro; portanto, se quisermos expressar a barra de barra, devemos escapar novamente:
System.out.println ("abac" .replaceall ("a", "////")); ///ab/acsystem.out.println("abac".replacefirst("a "," //// a ")); /// abacPara entender brevemente, a barragem frontal em "//// A" escapa da barra de barragem depois, para que a barra de barragem depois seja uma corda normal. Dessa forma, a string vista na memória java é "// A". Ao processar, a função ReplaceAll usa a barragem frontal para escapar da barra de barragem depois para expressar que a barra de barragem depois é uma string comum, não usada para escapar $, e a sequência final na memória é " /a", para que a possa ser substituída com sucesso por /a.
Resumir
A questão do Escape está realmente enredada. Através deste artigo, o autor espera que os leitores possam permanecer acordados ao usar essas funções no futuro, estar cientes dos caracteres especiais nos parâmetros e evitar escrever bombas de tempo. O acima é o conteúdo inteiro deste artigo. Espero que seja útil para estudar e trabalhar de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.