トップ回答者
正規表現 グループ化構成体 について

質問
-
http://msdn.microsoft.com/ja-jp/library/bs2twtah(v=VS.80).aspx
の最後方に出てくるサンプルソース内のpattern内の「(?(Open)(?!))」の意味がわかりません。
リファレンスのどの部分に当たるのか等の情報をいただければ幸いです。
回答
-
グループ定義を均等化、です。.NET Framework独自の正規表現機能かな、と思っています。
開きかっこ-閉じかっこの対応を確認できます。
質問に対する回答ですが、(?!) の部分ですが、正規表現を無条件に失敗させます。これによりバックトラックが発生します。
(?(Open)...) の部分ですが、開きかっこが残っているかを判断します。英語コメントに
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
とあります。
- 回答としてマーク おじゃるマル 2010年5月18日 11:51
-
佐祐理さんの補足になりますが、
"(?(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日 11:51
すべての返信
-
グループ定義を均等化、です。.NET Framework独自の正規表現機能かな、と思っています。
開きかっこ-閉じかっこの対応を確認できます。
質問に対する回答ですが、(?!) の部分ですが、正規表現を無条件に失敗させます。これによりバックトラックが発生します。
(?(Open)...) の部分ですが、開きかっこが残っているかを判断します。英語コメントに
3) If the "Open" group contains an unaccounted for left angle bracket, the
entire regular expression fails.
とあります。
- 回答としてマーク おじゃるマル 2010年5月18日 11:51
-
佐祐理さんの補足になりますが、
"(?(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日 11:51