1
resposta

Erro metodo replaceAll

Olá, estou utilizando o replaceAll, no seguinte caso :

linhaDigitada = linhaDigitada.replaceAll("!!", "!");

o resultado funciona tudo certinho, porem, ao tentar utilizar o seguinte:

linhaDigitada = linhaDigitada.replaceAll("??", "?");

é apresentado o seguinte erro:

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
??
^
    at java.base/java.util.regex.Pattern.error(Pattern.java:2027)
    at java.base/java.util.regex.Pattern.sequence(Pattern.java:2202)
    at java.base/java.util.regex.Pattern.expr(Pattern.java:2068)
    at java.base/java.util.regex.Pattern.compile(Pattern.java:1782)
    at java.base/java.util.regex.Pattern.<init>(Pattern.java:1429)
    at java.base/java.util.regex.Pattern.compile(Pattern.java:1069)
    at java.base/java.lang.String.replaceAll(String.java:2148)

não faço ideia do que pode estar acontecendo, já pesquisei e não acho uma solução, alguem tem ideia do que esteja acontecendo ?

1 resposta

Olá Felipe, tudo bem?

De acordo com JavaDoc, o método replaceAll:

Replaces each substring of this string that matches the given regular expression with the given replacement.

Ou seja, esse método trabalha com Expressões Regulares. O caractere "?" é como se fosse uma palavra reservada no mundo de Expressão Regular, ou seja, você não pode usá-la como se fosse um caractere comum. Mais detalhes no link abaixo:

https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

No caso do Java, você consegue contornar isso de duas formas.

1º - Escapando o "?" com \

//Primeiro, escapa a barra \ e depois escapa o caractere ?
linhaDigitada = linhaDigitada.replaceAll("\\?\\?", "?");

2º - Utilizando a classe Pattern

import java.util.regex.Pattern;

...

//O Pattern.LITERAL sinaliza que os caracteres próprios de Expressão Regular serão tratadas como caracteres comuns
Pattern padraoDuplaInterrogacao = Pattern.compile("??", Pattern.LITERAL);
linhaDigitada = padraoDuplaInterrogacao.matcher(linhaDigitada).replaceAll("?");

Espero ter ajudado.

Abraços!