replace () e replaceAll () em Java

O código a seguir usa o replace()método da Stringclasse em Java.

String a = "abc/xyz";
System.out.println(a.replace("/", "\\"));

/na String fornecida aestá sendo substituída por \.

A mesma coisa está errada, se usarmos o replaceAll()método da seguinte maneira.

System.out.println(a.replaceAll("/", "\\"));

Faz com que a exceção java.lang.StringIndexOutOfBoundsExceptionseja lançada. Requer duas barras invertidas adicionais \como a seguinte, pois replaceAll()usa uma regex que não é o caso do replace()método.

System.out.println(a.replaceAll("/", "\\\\"));

A única questão é por que esse método, quando usado com apenas duas barras como esta, é a.replaceAll("/", "\\")lançado java.lang.StringIndexOutOfBoundsException?


O split()método, por outro lado, emite inicialmente um aviso Invalid regular expression: Unexpected internal error(estou usando o NetBeans 6.9.1).

String b="abc\\xyz";
System.out.println(b.split("\\")[0]+b.split("\\")[1]); //Issues a warning as specified.

Uma tentativa de executar isso faz com que a exceção java.util.regex.PatternSyntaxExceptionseja lançada.

Como ele usa um regex como replaceAll(), ele requer quatro barras invertidas.

System.out.println(b.split("\\\\")[0]+b.split("\\\\")[1]);

Por que a.replaceAll("/", "\\\\");o exemplo anterior não emite um aviso ou uma exceção de tempo de execução, mesmo que possua um padrão inválido?

Resposta 1

No Javadoc String.replaceAll

Observe que barras invertidas ( \) e cifrões ($) na cadeia de substituição podem fazer com que os resultados sejam diferentes do que se estivessem sendo tratados como uma cadeia de substituição literal; consulte Matcher.replaceAll. Use Matcher.quoteReplacement (java.lang.String) para suprimir o significado especial desses caracteres, se desejado.

System.out.println(a.replaceAll("/", Matcher.quoteReplacement("\\")));
Resposta: 2

Eu tenho uma classe que aceita um ByteBuffer como argumento de construtor. Existe uma maneira de evitar fazer cópias defensivas para garantir que o buffer não seja modificado além desse ponto? ByteBuffer ....

Eu tenho um campo em um formulário para indicar a duração do tempo de um evento. Digamos, o evento dura 15 minutos. Portanto, o campo terá o seguinte valor: 00:15 Se durar 1 hora: 01:00, etc. Como posso ...

classe pública MySerializable implementa Serializable {private int x = 10; estático privado int y = 15; public static void main (String ... args) {AnotherClass a = new AnotherClass (); ...

Eu poderia jurar que, há alguns meses, baixei uma cópia do Java 1.5 SE JDK e não precisei fornecer informações sobre meu primeiro filho. Hoje, eu tive que passar pelo registro e nós ...