2011-06-29 17 views
7

La expresión regular parece estar bien, ya que la primera línea de la línea reemplazar correctamente la subcadena con "HelloWorld", pero la misma expresión no coincidirá en este último ya que no puedo ver "¿por qué no va a ir al mundo?" en la consolaPattern.matches no funciona, mientras que replaceAll hace

System.out.println(current_tag.replaceAll("^[01][r]\\s", "helloworld")); 

if (Pattern.matches("^[01][r]\\s", current_tag)) { System.out.println("whynothelloworld?");} 

Respuesta

15

Pattern.matches() espera que la cadena entera coincida, no solo una subcadena.

Utilice el método .find() del objeto coincidencias de expresiones regulares en su lugar:

Pattern regex = Pattern.compile("^[01]r\\s"); 
Matcher regexMatcher = regex.matcher(current_tag); 
foundMatch = regexMatcher.find(); 
+0

Parece que todos menos nosotros cometimos ese error cuando llegamos a Java. Cómo escapé de alguna manera, no lo sé. De alguna manera, tuve la suerte de usar 'encontrar', nunca' coincide', y esto fue antes de notar la diferencia. Supongo que fue porque estaba haciendo coincidencias incrementales en ese primer proyecto de Java, hace mucho (ish) ahora. Aún así, considero que es una falla de diseño/interfaz de usuario que hicieron esta tontería. – tchrist

+0

Aún más raro es Python: 're.match' ancla implícitamente la expresión regular al comienzo de la cadena (pero no al final) mientras que' re.search() 'se comporta como se esperaba (como' matcher.find() 'en Java) –

+0

ahora está claro :) tnx, ¡funciona como un encanto! –

-3

No puede coincidir de nuevo debido a que acaba de reemplazar con "HelloWorld".

Edit: Lo siento, se me olvidó cómo funcionaba.

+0

'replaceAll' devuelve una nueva cadena - no puede cambiar el contenido de una cadena existente, como las cadenas son inmutables. –

+0

@Jon Skeet: OK, parece que mi Java se está poniendo un poco oxidada. :-p – Sqenqe

Cuestiones relacionadas