2012-03-16 17 views
38

Jak dopasować łańcuch do wielu wzorców za pomocą wyrażenia regularnego w ruby.Dopasowywanie łańcucha znaków do wielu wzorców

Próbuję sprawdzić, czy ciąg znaków znajduje się w tablicy prefiksów. To nie działa, ale myślę, że demonstruje przynajmniej to, co próbuję zrobić.

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

Odpowiedz

74

Zastosowanie Regexp.union połączyć je:

Union (pats_ary) → new_regexp

zwrócić Regexp obiekt, który ma związek z podanych wzorców, czyli będzie pasował którejkolwiek z jego części.

Więc będzie to zrobić:

re = Regexp.union(prefixes) 

następnie użyć re jako regex:

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

+1 ładny. Użyję tego. – Kyle

+0

@Kyle: Dzięki. 'Regexp.union' może być o wiele przyjemniejszy w użyciu niż próba ręcznego zbudowania dużego regexu na przemian. –

+0

Jeszcze raz dziękuję @muistooshort! –

8

Jeśli można użyć pojedynczego ciągu, może być szybciej napisać wyrażenie zawierające ewentualne wartości.

np.

 
/(Mr\.|Mrs\.| ...)/.match(name) 
Powiązane problemy