まず(?2::\u$1)交換側はPerlで///gはありません。Boost独自の拡張機能です
その文書を参照すると、次のように述べられています。
キャラクター '?' 条件式を開始します。一般的な形式は次のとおりです。
?Ntrue-expression:false-expression
ここで、N は 10 進数です。
部分式 N が一致した場合、true-expression が評価されて出力に送信されます。そうでない場合、false-expression が評価されて出力に送信されます。
これを踏まえて謎を分析していきましょう(?2::\u$1)
?22 番目のキャプチャ グループがないため、常に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(キャプチャされた部分文字列の最初の文字を除くすべてが消える)