Interpolacja wyrażeń regularnych do innego wyrażenia regularnego
W następującym kodziek2
jest minimalnie różny odk1
. To jest,k2
jest dokładnie taki sam, z wyjątkiem tego, że jest zdefiniowany za pomocą interpolacji. (To znaczy jaspodziewany to dokładnie to samo; Oczywiście z wynikup k2
nie jest.)
v = /[aeiouAEIOUäöüÄÖÜ]/ # vowels
k1 = /[[ßb-zB-Z]&&[^[aeiouAEIOUäöüÄÖÜ]]]/ # consonants defined without interpolation
k2 = /[[ßb-zB-Z]&&[^#{v}]]/ # consonants defined same way, but with interpolation
Ale jak poniżej, używającgsub
zk1
działa, a używając gok2
zawodzi w sposób, którego nie rozumiem.
all_chars = "äöüÄÖÜß"<<('a'..'z').to_a.join<<('A'..'Z').to_a.join
p all_chars # "äöüÄÖÜßabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
p all_chars.gsub( k1 , '_' ) # "äöüÄÖÜ_a___e___i_____o_____u_____A___E___I_____O_____U_____"
p all_chars.gsub( k2 , '_' ) # "äöüÄÖÜ_abcdefghijklm_o_____u__x__ABCDEFGHIJKLMNOPQRSTUVWXYZ"
p k1 # /[[ßb-zB-Z]&&[^[aeiouAEIOUäöüÄÖÜ]]]/
p k2 # /[[ßb-zB-Z]&&[^(?-mix:[aeiouAEIOUäöüÄÖÜ])]]/
Dlaczego to nie działa? Co jest(?-mix:...)
? Czy istnieje sposób, aby uczynić tę pracę tak, jak tego oczekiwałem?