ここで、現代の正規表現は正規言語で表現できるものを超えているというコメントをいくつか見ました。これはどうしてですか?
最新の正規表現のどの機能が正規ではありませんか? 例は役に立ちます。
ここで、現代の正規表現は正規言語で表現できるものを超えているというコメントをいくつか見ました。これはどうしてですか?
最新の正規表現のどの機能が正規ではありませんか? 例は役に立ちます。
いくつかの例:
/my (group)/.match("my group")[1]
「グループ」を出力します。グループに何かを格納するには、有限オートマトンにはない外部ストレージが必要です。(?<MYGROUP>.)*
は「。」の複数のキャプチャを実行できます。同じグループ内。(?<MYGROUP>test)
はスタックをプッシュし、スタックを(?<-MYGROUP>)
ポップします。(?<FIRSTGROUP-LASTGROUP>)
、LASTGROUPをポップし、FIRSTGROUPスタックのLASTGROUPインデックス以降のキャプチャをプッシュする構文です。これは実際には、有限オートマトンの能力を確実に超えている、無限にネストされた構造に一致させるために使用できます。おそらく他の良い例が存在します:-)正規表現とバランスの取れたグループ化、したがって有限オートマトンよりも高次のオートマトンと組み合わせた外部スタックの実装の詳細のいくつかにさらに興味がある場合は、これについて2つの短い記事を書いたことがあります(http:/ /www.codeproject.com/KB/recipes/Nested_RegEx_explained.aspxおよび http://www.codeproject.com/KB/recipes/RegEx_Balanced_Grouping.aspx)。
とにかく-完成度かどうか-この余分なものが正規言語にもたらす力は素晴らしいと思います:-)
Br。モーテン
決定論的または非決定論的な有限オートマトンは、正規表現で記述された正規言語のみを認識します。正規表現の定義は単純です。Sをアルファベットとします。その場合、空集合、空文字列、および S のすべての要素は( Sに対する)正規表現です。uとvを正規表現とします。この場合、 uとvの結合 ( u | v )、連結 ( uv )、および閉包 ( u *) は、 S上の正規表現です。. この定義は、通常の言語に簡単に拡張できます。他の表現は正規表現ではありません。指摘したように、いくつかの後方参照は一例です。正規言語と正規表現に関するウィキペディアのページは参考になります。
本質的に、特定の「正規表現」は、特定のタイプのオートマトンを構築して認識できないため、正規表現ではありません。たとえば、言語
{ a^ i b^ i : i <= 0 }
規則的ではありません。これは、受け入れるオートマトンには無限に多くの状態が必要になるためですが、通常の言語を受け入れるオートマトンには有限数の状態が必要です。