9

これは、Sublime Text 2 の Ruby パッケージのスニペット ファイルの 1 つにある Perl スタイルの正規表現です。

/(?:\A|_)([A-Za-z0-9]+)(?:\.rb)?/(?2::\u$1)/g

「some_class.rb」のようなファイル名を「SomeClass」に変換することは知っていますが、この部分が何をするのかわかりません(?2::。Sublime Text 2 は正規表現に boost を使用するため、Boost-Extended Format String Syntaxのドキュメントを確認したところ、boost がフォーマット文字列 ( f.inst. (?2(foo):(bar))) の条件をサポートしていることがわかりましたが、そのために 2 つのコロンは必要ありません。 . さらに、2 番目?2の部分式を指しますが、上記の式は 1 つの部分式にしか一致しません。以上のことから、これは条件式ではないと思います。

啓発的な回答をありがとう。

4

2 に答える 2

8

まず(?2::\u$1)交換側はPerlで///gはありません。Boost独自の拡張機能です

その文書を参照すると、次のように述べられています。

キャラクター '?' 条件式を開始します。一般的な形式は次のとおりです。

?Ntrue-expression:false-expression

ここで、N は 10 進数です。

部分式 N が一致した場合、true-expression が評価されて出力に送信されます。そうでない場合、false-expression が評価されて出力に送信されます。

これを踏まえて謎を分析していきましょう(?2::\u$1)

  1. ?22 番目のキャプチャ グループがないため、常にfalseです。
  2. 最初:は「特殊文字」で、true-expression空の文字列を意味 します
    • true-expressionを空のままにすることはできないと仮定すると、最初の式:はtrue と false の式の間の区切りとして解釈されません(生々しい/ジューシーな詳細については、付録 Dを参照してください)。
    • 実際、true と評価されることはないため、(中間のどこかにtrue-expressionない限り)好きなように配置できます。:?2
  3. \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

  1. 右側の場合(?2::\u$1)、戻りますHelloWorld
  2. 右側の場合(?2:\u$1)、戻りますHW
  3. 右側が の場合(?2:$1)、何も返しません
  4. 右側の場合(?2:::\u$1)、戻ります:Hello:World
  5. 右側の場合(?1:\u$1)、戻りますHelloWorld
  6. 右側の場合(?1::\u$1)、戻りますHW
  7. 右側が の場合(?1::$1)、何も返しません
  8. 右側が(?1:::\u$1)リターンの場合HW
  9. 右側(?1:::$1)が何も返さない場合
  10. 右側の場合\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(キャプチャされた部分文字列の最初の文字を除くすべてが消える)

于 2013-06-26T14:41:16.537 に答える
2

置換文字列のように、置換文字列にコロンがある可能性があり:\u$1ます。

于 2013-06-26T13:56:04.567 に答える