2016-07-20 23 views
1

私はhereという正規表現を使用してCamelCaseをsnake_caseに変換しようとしています。ここで私が使用しているコードの抜粋です:

in := "camelCase" 
var re1 = regexp.MustCompile(`(.)([A-Z][a-z]+)`) 
out := re1.ReplaceAllString(in, "$1_$2") 

正規表現がlCaseと一致します。 $1l$2Caseなので、置換文字列"$1_$2"を使用すると、camel_Caseになります。代わりに、cameCaseになります。

交換文字列を"$1_"に変更すると、結果はcameとなります。 "$1+$2"に変更すると、結果はcamel+Casesee playground)となります。

現時点では、私の回避策は、"$1+$2"を置換文字列として使用し、strings.Replaceを使用してプラス記号をアンダースコアに変更することです。これはバグですか、私はここで何か間違っていますか?

答えて

2

この修正は、${1}_$2(または${1}_${2}の対称性)を使用します。 https://golang.org/pkg/regexp/#Regexp.Expand当たり

(私の強調):テンプレートに

は、変数名が文字の空でないシーケンスであるフォーム $名のストリングまたは$ {名前}、で表され、 数字、およびアンダースコア

... $名形式で

は、名前が に取られるできるだけ長くすること:$ 1Xは$ {1X}と等価ではなく、$ {1}、X、及び、 $ 10であります$ {1} 0ではなく$ {10}に相当します。

ので$1_$2に、あなたが実際に1_という名前のグループを探して、その後2という名前の別のグループとそれらを一緒に入れています。

理由で結果(そのことについてまたは$foo$2$1_$2を使用するように、「cameCase、」同じドキュメントが言うこと:

範囲や、比類のないインデックスのうちか ない名前を参照します正規表現に存在するものは、空のスライスに置き換えられます。

したがって、"$1_$2"と置き換えることは、ちょうど"$2"と置き換えることに相当します。

関連する問題