2013-03-09 85 views
-1

試圖使用gsub以字符串的出發順序同意字符以及字符'qu'的組合進行轉換。如何通過一個正則表達式((two specific character in a specific order) OR (any character in a set of characters)) any number of times連續特定的字符零次或多次紅寶石正則表達式

我已經嘗試了以下無濟於事聲明:

"stupid".gsub(/([(qu)]*[^aeiou]*)(.*)/, '\2\1') + 'ay' #=> "upidstay" correct! 
"uce".gsub(/([(qu)]*[^aeiou]*)(.*)/, '\2\1') + 'ay' #=> "eucay" NOT correct :(

"stupid".gsub(/((qu)*[^aeiou]*)(.*)/, '\2\1') + 'ay' #=> "stay" 

"uce".gsub(/([(qu)|[^aeiou]]*)(.*)/, '\2\1') + 'ay' #=> "eucay" # why does just a "u" match? 

我認爲它歸結爲是什麼我不知道如何使多個特定的連續字符[]中的一個選項,我認爲它是[(qu)]但爲什麼只有u得到匹配?

回答

1

這是你在找什麼?

cons = "(?:qu|[^aeiou])" 
"uce".gsub(/^(#{cons}+)(.*)/,'\2\1') + 'ay' # => uceay 
"stupid".gsub(/^(#{cons}+)(.*)/,'\2\1') + 'ay' # => upidstay 
"quduck".gsub(/^(#{cons}+)(.*)/,'\2\1') + 'ay' # => uckquday 
+0

將「qu」看作是明膠中的單個輔音...... – rudolph9 2013-03-09 03:53:22

+0

在這種情況下,您需要使用非捕獲組添加「qu」到輔音列表中: 'cons =「(? :曲| [^ AEIOU]) 「'' – nbarraille 2013-03-09 04:07:17

+0

缺點= 」(?:曲| [^ AEIOU])「'確實,因爲它不能在字符串中的字符匹配_not_工作'」 rququrqucebs」 .gsub(/(?: 。曲| [^ AEIOU])+(*)/, '\ 2 \ 1')+ 'AY' #=> 「ebsay」' – rudolph9 2013-03-14 14:53:50

1

字符類[]指定字符相匹配,從而[(qu)]將匹配(qu)

Piglatin正則表達式:/((?:(?:qu))*[^aeiou]*)(\w*)/

替換爲:'\2\1'和追加一個'ay'

代碼:

"quick".gsub(/((?:(?:qu))*[^aeiou]*)(\w*)/, '\2\1') + 'ay' 

見例如here

+0

U *不piglatin ... – rudolph9 2013-03-09 03:51:28

+0

這將追加兩個「AY」 – rudolph9 2013-03-09 15:12:17

+0

@ rudolph9:我不明白怎麼會是......這裏檢查:http://regex101.com/r/wT1mD7它將有助於向我們展示這些例外情況及其正確的預期結果 – 2013-03-09 15:54:54