質問
名前が示唆しているように、通常の表現は通常の言語のみに一致すると考えるかもしれません。しかし、私たちが実際に使用する定期的な表現には、理論的なカウンターパートで実装できるかどうかはわかりません。たとえば、どのように後方参照をシミュレートしますか?それで、疑問が生じます:実際に使用する正規表現の理論的な力は何ですか?一致する方法を考えていただけますか {(a^n)(b^n)|n>=0}
?どうですか {(a^n)(b^n)(c^n)|n>=0}
?
解決
あなたの質問に対する答えは、背景を可能にする「正規表現」言語であることです。 (言い換えれば、あなたが指摘したように、あなたは通常の言語でもCFLでも背中参照をシミュレートすることはできません。)実際、ウィキペディアは、私たちが実際に使用する「正規表現」言語の多くは NPコンプリート:
多数の最新のツールでサポートされているバックリファレンスの数のバックリファレンスとのマッチングは、NPコンプリートです(参照してください。
[11]
定理6.2)。
他の人が示唆しているように、コンピューター言語や図書館で一般的にサポートされている正規表現言語は、正式な言語理論における正規表現とは異なる動物です。 ラリー・ウォールは書いた Perlの「Regexes」に関しては、
「正規表現」[...]は、実際の正規表現にわずかに関連しています。それにもかかわらず、この用語は、パターンマッチングエンジンの機能により成長しているため、ここで言語の必要性と戦おうとはしません。しかし、私は一般的にそれらを「regexes」と呼びます
あなたは尋ねた、
{(a^n)(b^n)| n> = 0}に合う方法を考えていただけますか? {(a^n)(b^n)(c^n)| n> = 0}はどうですか?
あなたがテストしようとしているかどうかここにはわかりません 理論的 正規表現言語は、「正方形の言語」と一致する可能性があります。 (実用的)regex 言語。 前者が不可能な理由は次のとおりです。 と これが後者の長い説明と実装です Java Regexesの場合。
他のヒント
あなたが示唆している正規表現の基本的な難しさは、正規表現には「記憶」がないという事実です。最も純粋な形では、これらの言語のいずれかを認識することはできません。この種の言語を解析できる正規表現は、定義上、規則的ではありません。私はあなたが「私たちが使用する通常の表現は練習です」という意味だと思います 拡張 技術的には正規表現ではない正規表現。
あなたの質問の問題は、ほとんどの場合、災害で終わる実際の状況に、特に考案された理論的シナリオを適用するように求めていることです。
だから私の答えは一種の無回答です。 拡張 答えがあるための正規表現。
この問題に役立つかもしれないいくつかのリソース:
また、この考え方に貢献したい他の人のために、私の答えをコミュニティウィキにしています。