2011-07-15 9 views
5

¿Qué debo hacer para probar una coincidencia exacta con regex?Uso de la expresión regular para encontrar una coincidencia exacta de patrón en Ruby

"car".match(/[ca]+/) devuelve true.

¿Cómo obtendría el enunciado anterior para devolver falso ya que el patrón de expresiones regulares no contiene una "r"? Cualquier cadena que contenga caracteres que no sean "c" y "a" debería devolver falso.

"acacaccc" debe devolver verdadero

"acacacxcc" debe devolver false

Respuesta

9

añadir un poco de anclajes a ella:

/^[ca]+$/ 
+2

No: '" c \ nX ".match (/^[ca] + $ /)'. –

+0

Estos anclajes son incorrectos. Por favor, vea los comentarios a la respuesta de Chris Heald. – skalee

6

Sólo se necesita anclajes.

"car".match(/^[ca]+$/) 

Esto va a obligar a toda la cadena que se compone de "c" o "a", ya que el y "$" significa "comienzo" y "fin" "^" de la cadena. Sin ellos, la expresión regular tendrá éxito siempre que coincida con cualquier parte de la cadena.

+2

Esto se rompe en cadenas como '" caca \ nrabbits "'. Los anclajes adecuados serían '\ A' y' \ Z' – cam

+4

@cam: en realidad, usted quiere '\ z', no' \ Z', o echará de menos '" c \ n "'. –

+0

@mu es demasiado corto: buen punto, gracias. – cam

0

probar este

"car".match /^(a|c)+$/ 
3

Convierte tu lógica vuelta y buscar cosas malas:

string.match(/[^ca]/) 
string.index(/[^ca]/) 

Si bien lo anterior es no nulo, entonces usted tiene una mala cadena. Si lo que desea es probar y no se preocupan por donde coincide entonces:

if string.index(/[^ca]/).nil? 
    # You have a good string 
else 
    # You have a bad string 

Por ejemplo:

>> "car".index(/[^ca]/).nil? 
=> false 
>> "caaaacaac".index(/[^ca]/).nil? 
=> true 
1

Prueba esto:

"car".match(/^(?:c|a)$/) 
Cuestiones relacionadas