正規表現は


36

コンピュータサイエンスのバックグラウンドを持つ人でさえ、正規表現とは何かを尋ねると、その答えは、有限状態オートマトンの範囲内にあるという制約を超える可能性があります。

たとえば、「正規表現」

/^1?$|^(11+?)\1+$/

著名なPerlパーソナリティAbigail(および2002年以降のPerlのテストスイートの一部)によって作成された複合単項数のみを受け入れるマシンについて説明していますが、Peter Linzの第3版の正式な言語とオートマトンの演習4.5(b)では読者が使用しますそれを証明するポンピング補題

L={an:n is not a prime number}

通常の言語ではありません。

区別が重要なコンテキストでは、厳密に強力な表現を何と呼ぶべきでしょうか?

回答:


46

Larry Wallは、Kleeneが提案した形式主義に「正規表現」を使用し、広く使用されている拡張機能の表現に「regex」を使用することを提案しました。これはかなり広く採用されている慣習です。正規言語の意味で正規表現について話していることを明確にしたい場合、通常、正規言語の話に翻訳することは難しくありません。

正規表現の力はバックトラッキングから得られ、バックトラッキングを使用して通常の言語のオートマトンで行われた作業があります。特に、Becchi&Crowley、2008、Extending Finite Automata to Efficiently Matching Perl-Compatible Regular Expressionsを参照してください


5
「Perl regex」(「POSIX regex」など)と「通常の言語」のようなものは、誤解の可能性を防ぐために十分明確でなければなりません。
ユッカスオメラ

Perlの正規表現には、単なるバックトラックよりも多くの追加機能があります。
reinierpost

@reinierpost本当ですが、バックトラッキングは正式な言語の観点から最も重要なものだと思います。Perlの正規表現には、任意のPerlコードの実行などの機能がありますが、正規表現はPCREをカバーするものとして大まかに解釈されるべきだと思います。PCREには再帰パターンなどの奇妙な要素が含まれていますが、これらは暗い芸術であり、通常の言語の領域をはるかに超えています。ただし、これらをカバーするように回答を更新できます。
チャールズスチュワート

18

これらの表現は、Aho(理論計算機科学ハンドブック、Vol。A、5章)およびCampeanu、Salomaa、Yu(「実用的な正規表現の正式な研究」、International Journal of Foundation of Computer Science、14:1007)によって検証されています-1018、2003)、およびフォローアップペーパーの一部。

アホは、より強力な表現を「rewbr」(後方参照付きの正規表現)と呼んでいます。「拡張正規表現」と「実用的な正規表現」を使用します。思われるように、「拡張正規表現」は、最近の文献で最も一般的に使用されている用語です。

フランスの学校の「合理的表現」という言葉に基づいて、それらの表現が現実の世界で使われているという事実を考えると、私自身は「本当の表現」が好きです。

補遺:私の博士論文の章では、このクラスの形式言語を扱います(対応する論文はSTACS 2011に掲載される予定です)。その章と論文を書いている間、私はさまざまな用語で実験しました。最後に、後方参照付きのモデルには拡張正規表現を使用し、適切な正規表現には適切な正規表現を使用することにしました。すでに完全に(またはほとんど)書かれている論文の用語を変更するのは非常に面倒なので、私の選択につながった経験に興味がある人もいるかもしれません。

第一に、正規表現rewbrは実際に舌を転がすことはありません。また、特に複数形のいずれかを使用する場合、論文全体で何度も繰り返し使用することは非常に面倒です。 PERLのような正規表現も非常に扱いにくいものでした。もちろん、私はネイティブスピーカーではないので、YMMVです。

第二に、両方のモデルについて話したいとすぐに、正規表現のバリエーションである用語を使用すると便利です。これにより、必要に応じて類似性または相違を強調できます(たとえば、「正規表現、拡張」)。さらに、これにより、異なるモデルを比較する代わりに、クラス全体の特殊なケースについて話すときに、「後方参照のない拡張正規表現」の特殊なケースを簡単に強調できます。

第三には、私はすでに私の間の選択左、新たに造語、上の文献で使用される用語を使用することが好ましい拡張正規表現実用的な正規表現を。2番目の選択は、(少なくとも暗黙的に)適切な正規表現が何らかの形で非実用的であるということを暗示していました。

もちろん、この選択は私の「個人のローカル最大値」に過ぎず、必要に応じて、他の選択がより適切かもしれません。


7
残念ながら、拡張正規表現という用語は既にPOSIXで使用されており、基本正規表現(BRE)拡張正規表現(ERE)を区別します。どちらも定義に従って拡張正規表現です。
ヨルグWミットタグ

@Jörg:実際、これによると、拡張POSIX正規表現も基本POSIX正規表現も、正規表現よりも強力ではありません。そして、純粋な(GNU以外の)BREは実際には正規表現(代替演算子がない)よりも強力ではないようです。
sepp2k

この「rewbr」に関する最近の結果については、Carle and Narendran(2009)の「Extended Regular Expressions」を参照してください。portal.acm.org/ citation.cfm?id
Jakob

この言語クラスの最近の結果:「正規表現言語と正規言語の交差点」Campeanu and Santean(TCS 410、2009)「拡張正規表現の大規模クラスの多項式時間一致テスト」Reidenbach and Schmid(CIAA 2010 )、および「拡張正規表現:簡潔さと決定可能性」(私による、STACS 2011に登場予定)。
ドミニクD.フレイデンベルガー

6

perlのいわゆる正規表現はチューリング完全になるほど強力であることが知られています。通常のプログラムからperl正規表現までのコンパイラもあります。

したがって、この種の「正規表現」の名前を検索することは理にかなっていないと思います。

http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pmで例を見てください


ポインタはありますか?
アンドラスサラモン

5
@András:アーサーは?{CODE}、パターン表現がプログラムコードを正規表現にインターリーブできるようにするPerlのディレクティブについて話していると思います。PCREは通常、言語の「宣言的な」部分として定義され、言語全体がパターン言語と呼ばれていることを理解しています。WP、Aho、1990によると、「文字列内のパターンを見つけるためのアルゴリズム」は、バックトラッキングを使用した通常言語のメンバーシップの問題がNP完全であることを示しています。宣言型PCREに他に難しい機能はありません。
チャールズスチュワート

リンクを追加しました。私はソースコードを見なかったので、それがどのように機能するのか、コンパイルが本当に正しいという証拠があるかどうかは本当にわかりません。
アーサーミルチャー

1
申し訳ありませんが、あなたの議論によると、ラムダ計算はチューリング完全であるため、名前を検索することは意味がありませんでした。他のすべてのチューリング完全な計算形式および言語についても同じです。さらに重要なことに、チューリング完全性は言語の表現力を説明するものではないため、チューリング完全であるという理由だけで言語を識別することは意味がありません。もちろん、ラムダ計算に関する私の例は極端なものでした。
ブレイザーブレード

2

「オートマトンの文脈における正規表現」の最良の用語は、「Sakarovitchのオートマトン理論の要素」または「重み付けオートマトンのハンドブック」で使用されている「合理的表現」だと思います。


1
あまり一般的ではない、私見。
ブレイザーブレード

それは、重み付きオートマトン理論で広く使用されています。en.wikipedia.org / wiki / Rational_languageを参照してください。私はそれがグループ以上の言語の分野でも何度も見たことがあります。
ミカエルカディルハック

1

他の答えを考えると、「通常の言語」は安全であり、その違いに簡単に言及した後、正規表現の「実用的な正規表現」(バックトラック付き)について話すことをお勧めします。

また、正規表現と実際の表現として同じ正規表現が異なるセマンティクスを持つ可能性があることに注意してください。後者の場合、セマンティクスはバックトラックの観点から定義され、異なる結果が得られるからです。詳細はトピックから外れますが、それについて別の質問(おそらくここではなくSOについて)を尋ねて、コメントで私に通知したら答えます。


0

それらをパターン式と呼ぶことができます。これにより、パターン言語に混乱が生じる可能性がありますが、少なくともこれらはあまり一般的ではありません。


2
原則として、私はあなたの推論に同意しますが、Campeanu、Santean、およびYuは、パターン表現という用語をすでに使用して、「よりクリーンな」定義を持つ類似の言語クラスを示しています(「パターン表現とパターンオートマトン」、IPL 92(2004 )。
はDominik D. Freydenberger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.