2012-03-16 35 views
38

Làm cách nào tôi có thể đối sánh một chuỗi với nhiều mẫu bằng cách sử dụng cụm từ thông dụng trong ruby.Khớp một chuỗi so với nhiều mẫu

Tôi đang cố gắng xem chuỗi có được bao gồm trong một mảng tiền tố hay không, điều này không có tác dụng nhưng tôi nghĩ nó thể hiện ít nhất những gì tôi đang cố gắng làm.

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

Trả lời

74

Sử dụng Regexp.union để kết hợp chúng:

đoàn (pats_ary) → new_regexp

Return một đối tượng Regexp đó là sự kết hợp của các trao mẫu, tức là sẽ phù hợp bất kỳ bộ phận nào của nó.

Vì vậy, đây sẽ làm:

re = Regexp.union(prefixes) 

sau đó bạn sử dụng re như regex của bạn:

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

+1 Nice one. Tôi sẽ dùng cái này. – Kyle

+0

@Kyle: Cảm ơn. 'Regexp.union' có thể đẹp hơn rất nhiều so với việc cố gắng xây dựng một regex thay thế lớn bằng tay. –

+0

Cảm ơn một lần nữa @muistooshort! –

8

Nếu bạn có thể sử dụng một chuỗi, có thể viết nhanh hơn một regex chứa các giá trị có thể.

ví dụ:

 
/(Mr\.|Mrs\.| ...)/.match(name) 
Các vấn đề liên quan