2012-03-16 38 views
38

¿Cómo puedo unir una cadena contra varios patrones usando expresiones regulares en ruby?Coincidir una cadena con varios patrones

Estoy tratando de ver si una cadena está incluida en una matriz de prefijos. Esto no funciona, pero creo que demuestra al menos lo que estoy tratando de hacer.

# example: 
# prefixes.include?("Mrs. Kirsten Hess") 

prefixes.include?(name) # should return true/false 

prefixes = [ 
    /Ms\.?/i, 
    /Miss/i, 
    /Mrs\.?/i, 
    /Mr\.?/i, 
    /Master/i, 
    /Rev\.?/i, 
    /Reverend/i, 
    /Fr\.?/i, 
    /Father/i, 
    /Dr\.?/i, 
    /Doctor/i, 
    /Atty\.?/i, 
    /Attorney/i, 
    /Prof\.?/i, 
    /Professor/i, 
    /Hon\.?/i, 
    /Honorable/i, 
    /Pres\.?/i, 
    /President/i, 
    /Gov\.?/i, 
    /Governor/i, 
    /Coach/i, 
    /Ofc\.?/i, 
    /Officer/i, 
    /Msgr\.?/i, 
    /Monsignor/i, 
    /Sr\.?/i, 
    /Sister\.?/i, 
    /Br\.?/i, 
    /Brother/i, 
    /Supt\.?/i, 
    /Superintendent/i, 
    /Rep\.?/i, 
    /Representative/i, 
    /Sen\.?/i, 
    /Senator/i, 
    /Amb\.?/i, 
    /Ambassador/i, 
    /Treas\.?/i, 
    /Treasurer/i, 
    /Sec\.?/i, 
    /Secretary/i, 
    /Pvt\.?/i, 
    /Private/i, 
    /Cpl\.?/i, 
    /Corporal/i, 
    /Sgt\.?/i, 
    /Sargent/i, 
    /Adm\.?/i, 
    /Administrative/i, 
    /Maj\.?/i, 
    /Major/i, 
    /Capt\.?/i, 
    /Captain/i, 
    /Cmdr\.?/i, 
    /Commander/i, 
    /Lt\.?/i, 
    /Lieutenant/i, 
    /^Lt Col\.?$/i, 
    /^Lieutenant Col$/i, 
    /Col\.?/i, 
    /Colonel/i, 
    /Gen\.?/i, 
    /General/i 
] 

Respuesta

74

Uso Regexp.union combinarlos:

unión (pats_ary) → new_regexp

devolver un objeto Regexp que es la unión de los dados patrones, es decir, coincidirá cualquiera de sus partes.

Así que esto va a hacer:

re = Regexp.union(prefixes) 

continuación, utiliza re como su expresión regular:

if name.match(re) 
    #... 
+1

+1 uno de los buenos. Voy a usar esto – Kyle

+0

@Kyle: Gracias. 'Regexp.union' puede ser mucho más agradable de usar que tratar de construir una regex de alternancia grande a mano. –

+0

Gracias de nuevo @muistooshort! –

8

Si puede usar una sola cuerda, podría ser más rápido escribir una expresión regular que contenga los valores posibles.

p. Ej.

 
/(Mr\.|Mrs\.| ...)/.match(name) 
Cuestiones relacionadas