8

ウィキペディアによると、拡張正規表現は「後方参照のサポートを廃止」したため、それらを有効にするには「基本」正規表現モードを使用する必要があります。ただし、多くの実装では拡張正規表現の後方参照サポートされているようです。たとえば、Ubuntu Precise の gcc 4.6 ではサポートされています。FreeBSD の実装では、基本モードでのみサポートされているようです。

Boost は、後方参照は拡張正規表現ではサポートされていないと述べています (そして Wikipedia に同意しているようです) が、Boost::Regex はそれらを拡張機能として追加します。

これは、実装ごとに解釈が異なる標準の定義が不十分な部分ですか?

4

3 に答える 3

7

他の人がすでに指摘しているように、POSIXEREが後方参照をサポートしていないことは明らかです。

EREに後方参照を追加しないためのOpenGroupBaseSpecification Issue 7で与えられた理論的根拠は、次のように与えられます。

間隔式に加えて、後方参照('\ n')もEREに追加する必要があることが提案されました。これは、コンセンサスを低下させる可能性があるため、標準の開発者によって拒否されました。

引用元:理論的根拠:基本定義:拡張正規表現

この制限の主な理由は、POSIX EREを決定性有限オートマトン(DFA)に変換できるようにすることです。実際、UnixでのEREの元の実装はDFAとして行われました。DFAを使用すると、実装のパフォーマンスを保証できます。(無制限の数の)後方参照とのパターンマッチングは、NP困難な問題であり、おそらくNP完全問題ですらあります。EREの逆参照が提案された場合、POSIX標準委員会のコンセンサスに達することはできませんでした。これは、元のUnix実装を使用するすべての企業が、コードを非決定論的実装に変更し、パフォーマンス保証を削除することを余儀なくされるためです。それらの会社のメンバーは委員会にいました。

また、REの後方参照は、ユーザーにとっても実装者にとっても直感的ではなく、実際、これまで以上に頻繁に極端な混乱を引き起こしていることにも注意してください。たとえば、 RE-Interpretation:TheDarkCornersに記載されている例を参照してください。

注: REの後方参照は、sedなどのツールの置換テキストのサブパターンへの参照と同じではありません。

于 2012-11-13T06:19:08.243 に答える
4

IEEE/Open Group 標準によると、拡張正規表現は後方参照 (セクション 9.5.1) をサポートしていませんが、実際の実装ではサポートしています。

于 2012-11-12T15:53:12.547 に答える
1

POSIX.1-2008 標準によると、基本正規表現のみが後方参照をサポートしています。 セクション 9.3.6では、これらが BRE でどのように機能するかについて説明します。拡張正規表現セクションではそれらについてはまったく言及されておらず、セクション 9.5.1の文法語彙規則では、後方参照トークンは BRE にのみ適用されると述べています。

于 2012-11-12T15:57:51.313 に答える