ruby - palabras - Unir una cadena contra mĂșltiples patrones
ruby cadenas (2)
¿Cómo puedo hacer coincidir una cadena con múltiples patrones usando expresiones regulares en ruby?
Estoy tratando de ver si una cadena está incluida en una serie 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
]
Si puede usar una sola cadena, podría ser más rápido escribir una expresión regular que contenga los valores posibles.
p.ej
/(Mr/.|Mrs/.| ... )/.match(name)
Usa Regexp.union
para combinarlos:
union (pats_ary) → new_regexp
Devuelva un objeto
Regexp
que sea la unión de los patrones dados, es decir, coincidirá con cualquiera de sus partes.
Así que esto hará:
re = Regexp.union(prefixes)
entonces usas re
como tu expresión regular:
if name.match(re)
#...