まず(?2::\u$1)
交換側はPerlで///g
はありません。Boost独自の拡張機能です
その文書を参照すると、次のように述べられています。
キャラクター '?' 条件式を開始します。一般的な形式は次のとおりです。
?Ntrue-expression:false-expression
ここで、N は 10 進数です。
部分式 N が一致した場合、true-expression が評価されて出力に送信されます。そうでない場合、false-expression が評価されて出力に送信されます。
これを踏まえて謎を分析していきましょう(?2::\u$1)
?2
2 番目のキャプチャ グループがないため、常にfalseです。
- 最初
:
は「特殊文字」で、true-expression
空の文字列を意味
します
true-expression
を空のままにすることはできないと仮定すると、最初の式:
はtrue と false の式の間の区切りとして解釈されません(生々しい/ジューシーな詳細については、付録 Dを参照してください)。
- 実際、true と評価されることはないため、(中間のどこかに
true-expression
ない限り)好きなように配置できます。:
?2
\u$1
ですfalse-expression
。
2つ2つ合わせて、私は手足に出て言うつもりです
/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g
これを行う難読化された方法にすぎません。
/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/\u$1/g
付録 D: Sublime Text 2 でのスニペットの実験
そこで、このコンテンツで Sublime Text 2 スニペットを定義しました
<snippet>
<content><![CDATA[
snakecase: ${1:hello_world}
camelcase: ${1/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g}
]]></content>
<tabTrigger>convert</tabTrigger>
</snippet>
置換の右側のさまざまな表現をいじってみました。
入力を考えるとhello_world
- 右側の場合
(?2::\u$1)
、戻りますHelloWorld
- 右側の場合
(?2:\u$1)
、戻りますHW
- 右側が の場合
(?2:$1)
、何も返しません
- 右側の場合
(?2:::\u$1)
、戻ります:Hello:World
- 右側の場合
(?1:\u$1)
、戻りますHelloWorld
- 右側の場合
(?1::\u$1)
、戻りますHW
- 右側が の場合
(?1::$1)
、何も返しません
- 右側が
(?1:::\u$1)
リターンの場合HW
- 右側
(?1:::$1)
が何も返さない場合
- 右側の場合
\u$1
、戻りますHelloWorld
これに基づくいくつかの暫定的な結論 (ケース 2、6、8 が異常であると仮定† )
- 数字の後にコロン (
:
) が 1 つしかない場合、それは無視されます (つまり、式の true と false の間の区切りとして解釈されません)。
- 2 つのコロン (
::
) が数字の後に続く場合、true-expression
は空の文字列です (2 番目:
は区切り文字です)。
- 数字の後に3 つのコロン (
:::
) が続く場合、true-expression
は空の文字列であり、false-expression
はリテラル コロンで始まります (2 番目:
はセパレーター)
- ケース 1 と 10 を比較すると、 と の同等性に関する私の結論は
(?2::\u$1)
依然として\u$1
有効です。
†\u$1
と比較して非常に異なる動作をするため、異常と言った$1
(キャプチャされた部分文字列の最初の文字を除くすべてが消える)