2010-11-04 17 views
7

Estoy tratando de reemplazar el último punto en una cadena con una expresión regular.¿Cómo reemplazar el último punto en una cadena usando una expresión regular?

Digamos que tengo la siguiente cadena:

String string = "hello.world.how.are.you!"; 

quiero reemplazar el último punto con un signo de exclamación de tal manera que el resultado es:

"hello.world.how.are!you!" 

He intentado varias expresiones utilizando el método String.replaceAll(String, String) sin suerte.

Respuesta

12

Una forma sería:

string = string.replaceAll("^(.*)\\.(.*)$","$1!$2"); 

Alternativamente, puede utilizar búsqueda negativa hacia delante como:

string = string.replaceAll("\\.(?!.*\\.)","!"); 

Regex in Action

+0

Muchas gracias! Nunca hubiera llegado con ese monstruo. – digiarnie

+2

El hecho de que sea un monstruo (sus palabras, no las mías) es probablemente un buen argumento para _no_ usarlo :-) Aún así, si funciona, debe aceptarse ya que pidió una solución de expresiones regulares. – paxdiablo

+0

Estoy de acuerdo con eso. – digiarnie

8

Aunque se puede utilizar una expresión regular, a veces es mejor dar un paso atrás y solo hazlo a la vieja usanza. Siempre he creído que, si no se puede pensar en una expresión regular para hacerlo en unos dos minutos, probablemente no sea adecuada para una solución de expresiones regulares.

Sin duda, obtenga algunas respuestas regex maravillosas aquí. Algunos de ellos incluso pueden ser legible :-)

Puede utilizar lastIndexOf para conseguir la última ocurrencia y substring para construir una nueva cadena: Este completo programa muestra cómo:

public class testprog { 
    public static String morph (String s) { 
     int pos = s.lastIndexOf("."); 
     if (pos >= 0) 
      return s.substring(0,pos) + "!" + s.substring(pos+1); 
     return s; 
    } 
    public static void main(String args[]) { 
     System.out.println (morph("hello.world.how.are.you!")); 
     System.out.println (morph("no dots in here")); 
     System.out.println (morph(". first")); 
     System.out.println (morph("last .")); 
    } 
} 

la salida es:

hello.world.how.are!you! 
no dots in here 
! first 
last ! 
+0

Sí, tuve una solución usando StringBuilder y reemplazo en función del índice del último punto. Pero quería hacerlo usando una expresión regular si fuera posible, de ahí la pregunta. – digiarnie

+0

Al igual que un FYI, mi solución anterior con StringBuilder se veía así: StringBuilder builder = new StringBuilder (cadena); constructor.replace (lastDotIndex, lastDotIndex + 1, "!"); Cadena newString = builder.toString(); – digiarnie

7

La expresión regular que necesita es \\.(?=[^.]*$). la ?= es una afirmación de búsqueda hacia delante

"hello.world.how.are.you!".replace("\\.(?=[^.]*$)", "!") 
1

Prueba esto:

string = string.replaceAll("[.]$", ""); 
Cuestiones relacionadas