none
正規表現 グループ化構成体 について RRS feed

回答

  • グループ定義を均等化、です。.NET Framework独自の正規表現機能かな、と思っています。
    開きかっこ-閉じかっこの対応を確認できます。

    質問に対する回答ですが、

    (?!) の部分ですが、正規表現を無条件に失敗させます。これによりバックトラックが発生します。
    (?(Open)...) の部分ですが、開きかっこが残っているかを判断します。

    英語コメントに

      3)  If the "Open" group contains an unaccounted for left angle bracket, the 
    entire regular expression fails.

    とあります。

    2010年5月18日 2:39
  • 佐祐理さんの補足になりますが、
    "(?(Open)(?!))" の部分は、「代替構成体」の
    (?(name)yes|no)
    における "no" 部分の省略形だと思います。

    "(?!)" の部分は、"?(Open)" による判定によって Open のキャプチャがスタックに残っている場合の yes 条件として、「常にマッチする条件」にマッチしない場合に成功させる、つまり常にマッチを失敗させるようにしているのだろうと思います。

    試しにパターンの最後のところを
    "(?(Open)a|b)$"
    に変更すると、

    "<abc><mno<xyz>>" … アンマッチ
    "<abc><mno<xyz>" … アンマッチ
    "<abc><mno<xyz>a" … マッチ
    "<abc><mno<xyz>c" … アンマッチ
    "<abc><mno<xyz>>b" … マッチ
    "<abc><mno<xyz>>c" … アンマッチ

    という結果になりました。

    2010年5月18日 3:02

すべての返信

  • グループ定義を均等化、です。.NET Framework独自の正規表現機能かな、と思っています。
    開きかっこ-閉じかっこの対応を確認できます。

    質問に対する回答ですが、

    (?!) の部分ですが、正規表現を無条件に失敗させます。これによりバックトラックが発生します。
    (?(Open)...) の部分ですが、開きかっこが残っているかを判断します。

    英語コメントに

      3)  If the "Open" group contains an unaccounted for left angle bracket, the 
    entire regular expression fails.

    とあります。

    2010年5月18日 2:39
  • 佐祐理さんの補足になりますが、
    "(?(Open)(?!))" の部分は、「代替構成体」の
    (?(name)yes|no)
    における "no" 部分の省略形だと思います。

    "(?!)" の部分は、"?(Open)" による判定によって Open のキャプチャがスタックに残っている場合の yes 条件として、「常にマッチする条件」にマッチしない場合に成功させる、つまり常にマッチを失敗させるようにしているのだろうと思います。

    試しにパターンの最後のところを
    "(?(Open)a|b)$"
    に変更すると、

    "<abc><mno<xyz>>" … アンマッチ
    "<abc><mno<xyz>" … アンマッチ
    "<abc><mno<xyz>a" … マッチ
    "<abc><mno<xyz>c" … アンマッチ
    "<abc><mno<xyz>>b" … マッチ
    "<abc><mno<xyz>>c" … アンマッチ

    という結果になりました。

    2010年5月18日 3:02
  • >佐祐理さん、TH01さん 回答ありがとうございます 「(?!)」が無条件の失敗であるということは気付きませんでした。 「代替構成体」の件は「|」がなかったもので違うのかなと思ってましたが、 リファレンスをみると「no」は省略できると書いてありますね。 よく見てませんでした。 お二人の回答煮て疑問ははれましたどうもありがとうございます。
    2010年5月18日 11:51