2012-03-16 164 views
38

如何在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 
] 

回答

74

使用Regexp.union将它们结合起来:

联盟(pats_ary)→new_regexp

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

因此,这将做到:

re = Regexp.union(prefixes) 

然后使用re为您正则表达式:

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

+1尼斯之一。我会用这个。 – Kyle 2012-03-16 04:27:20

+0

@凯尔:谢谢。 'Regexp.union'可以比使用手工构建一个大的替换正则表达式更好用。 – 2012-03-16 04:33:53

+0

再次感谢@ muistooshort! – 2012-03-16 15:29:26

8

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

例如

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