2009-10-19 21 views

Respuesta

34

Sí, las expresiones regulares pueden hacer eso por usted:

"HelloWorldMyNameIsCarl".replaceAll("(.)([A-Z])", "$1_$2") 

La expresión [A-Z] coincidirá con todas las letras mayúsculas y ponerlo en el segundo grupo. Necesita el primer grupo . para evitar reemplazar la primera 'H'.

Como Piligrim señaló, esta solución no funciona para idiomas arbitrarios. Para capturar cualquier letra mayúscula definida por el Stardard Unicode necesitamos el Unicode 4.1 subproperty\p{Lu} que coincida con todas las letras mayúsculas. Entonces, la solución más general se ve como

"HelloWorldMyNameIsCarl".replaceAll("(.)(\\p{Lu})", "$1_$2") 

Gracias Piligrim.

+0

Pegúname a eso. No podía recordar si los reemplazos de expresiones regulares Java eran \ 1 o $ 1, así que tuve que buscarlos. –

+3

Tenga en cuenta que esta solución (a diferencia de la dada por ChssPly76) no funciona para todas las letras mayúsculas, pero solo para las inglesas: Ä so Û so Û Û Û Û Û Û Û Û Û Û Û. – Henning

+1

Argumentaría que su cadena de ejemplo implica inglés. –

2

Aquí hay una pista para hacerle pensar a lo largo de una posible solución:

  1. Encuentra una manera de dividir la cadena en partes en cada letra mayúscula
  2. Una las cuerdas divididas de nuevo con guiones entre ellos

palabras clave útiles:

  • dividieron
  • expresión regular/regex
+1

Esto es una prueba viviente de cuán grande es realmente esta cita: http://stackoverflow.com/questions/58640/great-programming-quotes/58646#58646 :-) – ChssPly76

+0

¿Qué tienes contra expresiones regulares, ChssPly76? –

+0

String.split elimina los caracteres coincidentes (= división) y, por lo tanto, no es realmente útil aquí. – Henning

3

¿Es esta tarea? Para empezar:

  1. Crear una Iterar StringBuffer
  2. por encima de su cadena.
  3. Marque cada carácter en mayúscula (java.lang.Character clase ayudará)
  4. Agregue guión bajo al búfer si es así.
  5. Agregue el carácter actual al búfer.
+0

La división o la expresión regular parecen mucho más naturales. –

+0

Incluso pidió expresiones regulares. –

+0

+1 - Esto me parece una solución perfectamente viable (especialmente si esto es tarea). –

Cuestiones relacionadas