【问题标题】:Match a string against multiple patterns将字符串与多个模式匹配
【发布时间】:2012-04-01 15:56:58
【问题描述】:

如何使用 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
]

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    使用Regexp.union 组合它们:

    union(pats_ary) → new_regexp

    返回一个Regexp 对象,它是给定模式的联合,即,将匹配它的任何部分。

    这样就可以了:

    re = Regexp.union(prefixes)
    

    然后你使用re 作为你的正则表达式:

    if name.match(re)
        #...
    

    【讨论】:

    • @Kyle:谢谢。 Regexp.union 使用起来比尝试手动构建一个大的替代正则表达式要好得多。
    【解决方案2】:

    如果您可以使用单个字符串,则编写包含可能值的正则表达式可能会更快。

    例如

    /(先生\.|夫人\.| ... )/.match(姓名)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2014-04-10
      • 2017-03-29
      • 1970-01-01
      • 2013-02-12
      • 2021-12-08
      • 1970-01-01
      相关资源
      最近更新 更多