2011-04-04 22 views
5

Gah, regex es un poco confuso.¿Cómo podría eliminar el último carácter de una cadena si es una puntuación, en ruby?

estoy tratando de eliminar todos los posibles signos de puntuación al final de una cadena:

if str[str.length-1] == '?' || str[str.length-1] == '.' || str[str.length-1] == '!' or str[str.length-1] == ',' || str[str.length-1] == ';' 
    str.chomp! 
end 

Estoy seguro de que hay una mejor manera de hacer esto. ¿Alguna sugerencia?

+3

Only _slightly?! _ 8 ^) – ridgerunner

+0

Aclare si los caracteres como '#', '@', '-', '_' califican como puntuación en su lista de cosas para eliminar. Qué tal si ':'? –

+0

A partir de ahora, solo los que he enumerado. Creo: puntual: incluye el resto que mencionaste, pero solo estaba interesado en eliminar los personajes que mencioné anteriormente. – oxo

Respuesta

7
str.sub!(/[?.!,;]?$/, '') 
  • [?.!,;] - clase de caracteres. Coincide con cualquiera de los 5 caracteres (nota, . no es especial en una clase de caracteres)
  • ? - Carácter anterior o grupo es opcional
  • $ - Fin de la cadena.

Esto básicamente reemplaza un carácter de puntuación opcional al final de la cadena con la cadena vacía. Si el personaje no tiene puntuación, es un no-op.

+0

Pregunta simple: Sería str.sub! (/ [?.!,;]? $ /, '') Suficiente (y modificar str en su lugar) o tendría que establecer str = str.sub! (/ [?. !,;]? $ /, '') en su lugar? – oxo

+1

Dado que está utilizando 'sub!', Cambiará la cadena en su lugar. –

0

todos los caracteres que no sean palabras.

text.gsub(/\W$/, "")

lo que esto hace es que hace es mira a la cadena, se encuentra la puntuacion al final, y en el mundo sustituye con nada = lo que se quita.

Esto realmente funciona, y es una forma Ruby de usar expresiones regulares.

+0

Esa expresión regular es totalmente diferente de lo que él pidió. Y devuelve una nueva cadena, en lugar de modificar la existente. –

+0

aquí hay una manera útil de probar tu expresión regular. [link] (http://www.rubular.com/) – Ray301

+0

Al igual que Rockerest, esto coincide tanto con los espacios como con la puntuación. –

0

Debería poder usar una expresión regular para hacer esto. No tengo ninguna experiencia con el rubí, pero aquí es una expresión regular que debe funcionar:

/(.*)[^\w\d]?$/ 

Puede utilizar retrorreferencia # 1 para obtener la cadena sin el último carácter puntuacion.

+0

Esa expresión regular no es lo que él pidió. Hay muchos otros personajes que coincidirán con los tuyos, '@' es solo uno. –

+0

'@' es la puntuación ... y creo que está abusando del privilegio [downvote] (http://stackoverflow.com/privileges/vote-down). Explique cómo esta publicación fue "notoriamente descuidada, sin gasto de trabajo, o una respuesta que es clara y tal vez peligrosamente incorrecta" – rockerest

+0

@rockerest, 1. Dijo que desea un mejor equivalente a su código actual. 2. El tuyo también coincide con elementos como la pestaña, que definitivamente no es puntuación. –

0
mystring.gsub(/[[:punct:]]+$/,"") 
+0

Eso tiene uno o más caracteres, y el punto coincide mucho más que los 5 que enumeró. –

+0

Si bien esto no es lo que necesitaba (en este momento), gracias por: puntual: - No lo sabía. ¿Cuáles son todas las coincidencias puntuales que esto concuerda? – oxo

2

La pregunta original declaró 'Eliminar todos los posibles signos de puntuación al final de una cadena ' pero el ejemplo sólo se menciona mostraron 5, '?','. ' '',' '' ; "Es de suponer que los otros caracteres de puntuación tales como. ':' '"', etc. deben ser incluidos en 'todos los posibles signos de puntuación', a fin de utilizar el: punct: clase de caracteres como señaló Kurumi:

str.sub!(/[[:punct:]]?$/,'') 
0

Sin usar la secuencia vacía:

str = /[?.!,;]?\z/.match(str).pre_match 

o en el otro orden

str = str.match(/[?.!,;]?\z/).pre_match 
0

str.chomp! no va a hacer nada en este caso. Tendría que hacer str.chop!

Cuestiones relacionadas