貪欲でない(消極的な)数量詞を含む正規表現は、それらを使用しないように書き換えることができますか?


8

貪欲な量指定子、貪欲でない量指定子を含む正規表現言語について考えてみましょ、順序付けられた代替、および文字クラス。(これは本質的にPCREのサブ言語であり、後方参照、ルックアラウンドアサーション、またはその他のより洗練されたビットはありません。)

文字列正規表現の一致 は、半分開いた間隔であり、は、。R s = s 0s n N s a 0s a 11 R[a0a1Rs=s0sNsa0sa11R

あるマッチを他のマッチより良くするものを再帰的に定義します。一致正規表現のためのの文字列には、より良い別の一致よりも場合又は、もしと:Ra=[a0a1Ra 0 < b 0 a 0 = b 0b=[b0b1a0<b0a0=b0

  • が文字クラスの場合:文字クラスには一意の一致があるため、の同じ位置にあるすべての一致は等しくなります。したがって、このケースは不可能です。RRR

  • 場合:R=ST

    • 先頭部分のためのよりよい一致であるの先端部よりも、又はS baSb
    • 主要部分と等しくための良好な一致である、および末尾部分のためのよりよい一致であるの後端部よりも。abSaTb
  • 場合:R=S|T

    • aはと一致し、は一致しない、またはSb
    • aにも同様に良い一致しているとより良いマッチであるよりも、ある、またはbSaSb
    • aために一致していないが、試合のためにある、そしてより良いマッチであるよりあります。bSTaTb

他のすべての構文形式は、一致の優先度のために上記の3つに削減されます。

  • R=SRS0|S1|
  • R=SR|S1|S0

これらの無限パターンは、一致優先度の目的でのみ使用されます。これらは、検討中の一致言語の一部ではありません。

「より良い」関係とは、特定のパターンのすべての一致に対して弱い線形順序です。

すべての有限入力文字列について、のペアワイズディスジョイントのベストマッチのセットがペアワイズディスジョイントのベストマッチのセットに等しい場合、2つの正規表現マッチ相当を呼び出します。ST ST

Q:貪欲でない量指定子を含むすべての正規表現に当てはまり貪欲でない量指定子を含まない、一致する正規表現ありますか?ST

編集:これは、質問の内容を明確にするために質問を完全に書き直したものです。


1
質問でLaTeXを修正しようとしましたが、それが意図したものであることを確認してください。(\ttLaTeXが特殊文字と制御シーケンスを解釈することを妨げません!)
伊藤剛

2
正規表現の「表現力」が何を意味するのか注意する必要があります。正規表現が認識する言語のみを検討する場合、不本意な数量詞が正規表現が最初に認識する言語を変更しないため、不本意な量指定子が追加の機能を追加しないことは自明です。しかし、キャプチャされた部分文字列など、正規表現のより細かいプロパティについて考えていると思います。
伊藤剛

1
いいえ、L(a+?)はまだ{a ^ n:n≥1}です。(Perl などで)アンカーされていない正規表現一致を実行した場合、結果'aaaa' =~ /a+?/は得aaaaられませんが、ブランチがとは異なる順序で試行されるためですa+。アンカー('aaaa' =~ /^a+?\z/Perl など)で適切に実行するaaaaと、結果が得られます。
伊藤剛

1
(1)私のコメントと回答があなたが質問をよりよく述べるのに役立つことを知って嬉しく思います(たとえあなたがそれを認めていなくても)。(2)「SとTがtに対して持つ非重複マッチのセット」は、いくつかの非重複マッチのセットが存在する可能性があるため、明確に定義されていないことをご理解いただければ幸いです。(//gPerlの)グローバル正規表現一致が返すリストについて話しているのですか?
伊藤剛

2
あなたは質問を片付ける必要があります。貪欲対非貪欲が受け入れられるものを変更しない場合でも、マッチを「受け入れる」ことについて話していることになります。これは、一致を検索して多くを見つけるときに、どの一致を見つけるかを指定する手段にすぎません。
イーモンネルボンヌ、2011

回答:


3

この回答は、2つの正規表現が同じ言語を認識するため、それらの同等性が同等であると定義されているという仮定に基づいています。現在の質問には答えません。


消極的な量指定子が正規表現が一致する文字列のセットを変更するというよくある誤解があります。変更は行われず、最初に試行されるオプションのみが変更されます。

たとえば'aaaa' =~ /a+/、Perlで正規表現一致を実行すると、文字列内の最初の一致が検出さaaaaれ、特別な変数で一致した部分文字列が記憶されます。aaaa特定の正規表現に一致する部分文字列が複数ある場合でも、最初の一致以外の一致は無視されます。

数量詞が貪欲であるか消極的であるかは、最初の一致が多くの一致の中で何に影響するかですが、一致のセットは変更されません。この意味で、正規表現が一致する文字列のセットは、通常の貪欲な量指定子を使用しても、消極的な量指定子を使用しても変わりません。


いいえ、アンカーされていないパターンが指定された文字列に適用される一連の一致について話しているのでありません。与えられたパターンがそれらの文字列全体と一致する文字列のセットについて話している。言い換えると、最初の一致文字列全体である文字列のセットの同等性を維持するためにパターンを書き換えることに興味がありますa+そしてa+?、この意味で同等でaaaaはありません:後者に一致しません。
uckelman

1
@uckelman:定義によると、文字列abbba*(..)*の最初abbbの正規表現a*(..)*との一致はであるため、文字列はL()にはありませんabb。これは、正規表現で認識される言語の標準的な定義ではありません。それが本当にあなたが興味を持っているものであるなら、あなたはそれを違う名前にすべきです。
伊藤剛

uckelman、私はかなりa+?一致すると確信していaaaaます。Rubyの正規表現がそうであることは知っています。
ラファエル

@Raphael:"aaaa" =~ /a?/Rubyでtrueを返すことについて話していると思いますが、これは、パターンがの部分文字列と 一致するaaaaためはなく、と一致するためでありませんaaaa
伊藤剛

私は+(編集された)を逃し、Rubyは単語全体と一致しているようです(rubular.comを参照)。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.