Подтвердить что ты не робот

Сопоставьте строку с несколькими шаблонами

Как я могу сопоставить строку с несколькими шаблонами, используя регулярное выражение в ruby.

Я пытаюсь проверить, включена ли строка в массив префиксов. Это не работает, но я думаю, что это демонстрирует, по крайней мере, то, что я пытаюсь сделать.

# 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
]
4b9b3361

Ответ 1

Используйте Regexp.union, чтобы объединить их:

union (pats_ary) → new_regexp

Возвращает объект Regexp, который является объединением данных шаблонов, то есть будет соответствовать любой из его частей.

Итак, это будет делать:

re = Regexp.union(prefixes)

то вы используете re в качестве своего регулярного выражения:

if name.match(re)
    #...

Ответ 2

Если вы можете использовать одну строку, возможно, быстрее написать регулярное выражение, содержащее возможные значения.

например.

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