2016-05-08 6 views
1

"snake_case""CamelCase"に変換する方法は次のとおりです。文字列"camel_case"正規表現とキャプチャの置換

def zebulansNightmare(string) 
    string.gsub(/_(.)/){$1.upcase} 
end 

、私はgsub(/_(.)/)_cに一致するように期待しています。 $1が最初にマッチした文字であることを理解しました。大文字です。しかし、大文字で_を代用しているように動作します。 _はなぜ消えたのですか?

+0

グループ1に取り込まれた大文字の値でマッチ全体を置き換えます。 –

+0

ドキュメントでは、 'gsub'が' $ 1'を置き換えると言いますか? – sawa

答えて

1

$1はキャプチャ値ですが、gsubはその前に_の文字と一致し、完全一致が置き換えられます。あなたは結果に_を再挿入する必要があります:あなただけにしようとする上で、時間とリソースを無駄にしないように_文字(と続い一致することを計画している場合

"camel_case".gsub(/_(.)/){"_#{$1.upcase}"} 

は、BTW IDEONE demo

を参照してください。 \p{Ll}は、任意の小文字のUnicode文字です

/_(\p{Ll})/ 

:)大文字に非手紙を回すには、次の正規表現を使用することができます。

+1

ありがとうございます! – Jes

0
def zebulans_nightmare(string) 
    string.gsub(/\B_[a-z0-9]/) { |s| s[1].upcase } 
end 

zebulans_nightmare("case_of_snakes") 
    #=> "caseOfSnakes" 
zebulans_nightmare("case_of_3_snakes") 
    #=> "caseOf3Snakes" 
zebulans_nightmare("_case_of_3_snakes") 
    #=> "_caseOf3Snakes" 

\Bmatches non-word boundaries

+0

あなたのお答えいただきありがとうございます - 私は本当にそれを取得しない - なぜ '_'の後の最初の文字がインデックス1を持っているのですか? '_'はインデックス0を持っているようですが、正規表現で '\ B'の後に '_'があることを考慮すると、なぜですか? – Jes

+0

私はあなたのインデックスへの参照を理解していませんが、 '\ B'は" _case_of_snakes "の" c "を大文字にすることを避けるためにしかありません。 –

+0

私の問題は、この例でインデックスがどのように機能するかです:)最初に一致する文字は[0]ですか? – Jes