2010-10-27 12 views
7

estoy luchando para conseguir una expresión regular (en Ruby) que proporcionará la siguiente¿Cómo puedo coincidir con una cadena hasta la primera coma (si está presente) con una expresión regular Rubí

"one, two" -> "one" 
"one, two, three" -> "one" 
"one two three" -> "one two three" 

que desea hacer coincidir cualquier personaje hasta la primera coma en una cadena. Si no hay comas, quiero que coincida toda la cadena. Mi mejor esfuerzo hasta ahora es

/.*(?=,)?/ 

Esto produce la siguiente salida a partir de los ejemplos anteriores

"one, two" -> "one" 
"one, two, three" -> "one, two" 
"one two three" -> "one two three" 

cerca, pero no puro. ¿Alguien puede ayudar?

Respuesta

10

Me pregunto si no puede ser más simple:

/([^,]+)/ 
+0

Eso es bueno. Funciona igual que/[^,] +/ – brad

+0

¡Parece una extraña carita! – MOnsDaR

2

¿Qué tal /.*?(?=,|$)/ De esta forma se lee hasta el final o en una coma.

+0

Pero si lo hace '/.*?(?=,)?/', ¿no coincidiría con la cadena vacía? – LarsH

8

¿Coincide solo las comas desde el principio? ej .:

/^[^,]+/ 
+0

Tuve una idea similar. Creo que necesitas los parens para la captura, pero puedo robar tu ancla de inicio de línea. – Telemachus

+0

@Telemachus, no necesita paréntesis para que toda la expresión regular coincida con la cadena requerida. – LarsH

+0

@Telemachus, depende de cómo lo use, por ejemplo, string.match (/.../) devolverá cualquier cosa que coincida con la expresión regular o nil si no hay coincidencia, no se necesita captura. EDITAR: Lo que dijo LarsH. – pbaumann

14

¿Se tiene que ser una expresión regular? Otra solución:

text.split(',').first 
+0

No tiene que ser, pero 'quiero' que sea – brad

+0

Curioso. ¿Por qué 'quieres' que sea una expresión regular? ¿Hay una ventaja? –

+2

@brad Por lo que sea, no debes tener el hábito de pensar que todos los problemas de cadena requieren expresiones regulares. Puede manejar muchos casos de otras maneras. – Telemachus

Cuestiones relacionadas