2010-02-12 20 views
6

Tengo un código que estoy convirtiendo de Perl a Java. Hace bastante uso de las expresiones regulares, incluido el operador s///. He estado usando Perl durante mucho tiempo y aún me estoy acostumbrando a la forma de hacer Java de las cosas. En particular, las cuerdas parecen más difíciles de trabajar. ¿Alguien sabe o tiene una función de Java que implementa completamente s///? De modo que pudiera manejar algo como esto, por ejemplo: (. Quizás no es un gran ejemplo, pero usted consigue la idea)equivalente de Java del operador /// de Perl?

$newString =~ s/(\bi'?\b)/\U$1/g; 

Gracias.

+3

Eche un vistazo a la biblioteca de expresiones regulares de Yakarta ORO, para \ U support vea la http://jakarta.apache.org/oro/api/org/apache/oro/text/regex/Perl5Substitution.html clase – rsp

+0

Se ve muy útil, gracias! – reid

+0

Después de examinarlo un poco, ORO es de hecho muy útil. Tener s /// y un operador de U incorporado es genial. Hasta ahora, ¡lo recomiendo! – reid

Respuesta

1

Eche un vistazo al método replaceAll(...) de String. Tenga en cuenta que Java no es compatible con la función \U (mayúsculas).

+0

Gracias. También encontré Matcher.replaceAll(). ¿Son lo suficientemente poderosos como para manejar mi ejemplo de mejorar el partido, sin embargo ...? – reid

+0

'Matcher.replaceAll()' es usado por 'String''s' replaceAll() '. Entonces, eso responde a su otra pregunta: no, '\ U' no es compatible. –

+0

Me perdí la parte \ U de tu respuesta. Supongo que tengo que aceptar que replaceAll() funcionará para la mayoría, pero no para todos los casos. – reid

6

Nada tan ordenado, pero en Java que usaría String.replaceAll() o utilizar Pattern a hacer algo como:

Pattern p = Pattern.compile("(\bi'?\b)"); 

Matcher m = p.matcher(stringToReplace); 
m.replaceAll("$1"); 

Compruebe la documentación del patrón para la sintaxis de expresiones regulares de Java - no se superpone completamente con Perl.


Para obtener uppercasing, echa un vistazo a Matcher.appendReplacement:

StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    String uppercaseGroup = m.group(1).toUpperCase(); 
    m.appendReplacement(sb, uppercaseGroup); 
} 
m.appendTail(); 

No tan cerca como la biblioteca Perl Jakarta-oro hace referencia más arriba, pero sin duda alguna ayuda integrada en la biblioteca.

2

Dada una instancia de una clase String se puede utilizar el método .ReplaceAll(), así:

String A = "Test"; 
A.replaceAll("(\bi'?\b)","\U$1"); 

Editar - bien demasiado lento. También aparentemente \ U no es compatible según otra respuesta.

Nota: No estoy seguro de cómo se traduce el símbolo goloso, es posible que desee probar en la implementación de Java si lo necesita específicamente.

+0

El '\ U' en su cadena de reemplazo provocará que se genere una RuntimeException. –

+1

Gracias. Me impresionó mucho el hecho de que la sintaxis de la expresión regular sea idéntica, aparte de la retroversión adicional en Java. (Demasiado malo sobre \ U, sin embargo). Desearía que el manejo de las cadenas de Java fuera más parecido al de Perl ... – reid

+1

En lo que respecta a la manipulación de cadenas, Perl es el rey. Pero sí, la implementación de expresiones regulares de Java es sólida y poderosa, aunque a veces prolija con todas las barras diagonales inversas y la creación de objetos. –

Cuestiones relacionadas