2013-08-23 27 views
5

有沒有更好的方式在Ruby中編寫下面的正則表達式?第一個正則表達式匹配一個以小寫輔音開頭的字符串,第二個帶有元音。使用正則表達式來檢查一個字符串是否以輔音開頭

我想弄清楚是否有辦法編寫一個匹配第二個表達式的負數的正則表達式,而不是寫入幾個範圍的第一個表達式。

string =~ /\A[b-df-hj-np-tv-z]/ 
string =~ /\A[aeiou]/ 

回答

11

聲明

$string =~ /\A[^aeiou]/ 

將測試該字符串是否與非元音字符,包括數字,標點符號,空格和控制字符開始。如果你事先知道,那很好,字符串以字母開頭,但要檢查它是否以輔音開頭,你可以使用前瞻性前瞻來測試它是以字母還是非元音開頭的,就像這樣

$string =~ /\A(?=[^aeiou])(?=[a-z])/i 

要匹配輔音的任意號碼,你可以使用子表達式(?i:(?![aeiou])[a-z])匹配輔音。它是原子的,所以你可以在它後面重複計數,如{3}。例如,該程序查找所有在列表中包含了三個連勝輔音串

list = %w/ aab bybt xeix axei AAsE SAEE eAAs xxsa Xxsr/

puts list.select { |word| word =~ /\A(?i:(?![aeiou])[a-z]){3}/ } 

輸出

bybt 
xxsa 
Xxsr 
+0

謝謝,這也非常有幫助! – evkline

+0

你會如何匹配多個字符?例如,如果你想查找前3個字母是否是輔音,在表達式後面是{3}? – evkline

+1

@ EMK428:我的歉意 - 我陷入了Perl!我修改了我的答案,以顯示如何匹配在「輔音」子表達式上使用重複計數。 – Borodin

2

如果你想趕上不以元音開始的字符串,但只能從輔音開始,你可以使用下面的代碼。如果一個字符串具有比其他任何字母開頭,返回true,E,I,O,U 小號是我們給一個函數

if /^[^aeiou\W]/i.match(s) == nil 
    return false 
    else 
    return true 
    end 

在年底加入到定期任何字符串表達式不區分大小寫。

\ W用於捕獲任何非文字字符,例如,如果一個字符串中包含數字開頭:「1something」

[^ AEIOU]指範圍字符的除了AEIOU

,我們把^之初[之前,表明以下範圍[^ AEIOU \ W]如果在第1個字符

2

我修改了@Alexander Cherednichenko提供的答案,以擺脫if語句。

/^[^aeiou\W]/i.match(s) != nil 
相關問題