3

(a|b)*(ab)+ 私が知っているregexpを持っているとしましょう。これは、 0以上*意味し、 1以上を意味し、またはのいずれかを意味しますか?+|

したがって、、、、、aabおよびが機能abします。ababbbbbbbbbbbbbabaaaaaaaaaaaaaaab

(a|b)*|(ab)+単独の場合にこれらの表記法を理解しようとすると、うまくいくでしょうか?
しかし、一人ではうまくいきません(a|b)*(ab)+

4

4 に答える 4

4

あなたが正しいです。

(a|b)*|(ab)+a最初の選択肢 ( (a|b)*) を取り、次に正確に 1 つの と一致するためaです。実際、この正規表現は空の文字列にも一致します。

(a|b)*(ab)+一方、何も選択できません。0 に一致する可能性が(a|b)ありますが、少なくとも 1 つ存在する必要がありますab

(a|b)*また、最初の正規表現はand と同等であることに注意してください。[ab]*これは、繰り返される可能性をすでにカバーしているため(ab)です。(実際には、サブグループをキャプチャするという点でわずかな違いがありますが、これはおそらく、あなたにとって関連または適用可能なものを超えています)。

于 2012-10-17T17:26:46.450 に答える
2

あなたは全面的に正しいです。

より明確に、または少なくとも実際の画像なしでできる限りうまく描くために、さまざまな部分をセクションで見ることができます.

(a|b)

a これはまたは に一致しbます。これに ("kleene star" という名前の)を追加すると、*0 回以上一致します。

(a|b)*

これは正規表現の先頭にあるため、入力の先頭にaand/orの組み合わせを繰り返し使用できることを示していbます。

2 番目のグループ:

(ab)

aこれには、 の後に が続く必要がありますb。a を追加する+と、1 回以上発生します。

(ab)+

したがって、これは正規表現abの最後にあるため、文字列の最後に 1 つ以上の繰り返しシーケンスがある可能性があることを示しています。

に組み合わせると、入力が少なくとも 1 つの で終わる限り、と(a|b)*(ab)+を任意に組み合わせることができます。abab

2 つのセットの間に を追加する|と、最初に一致するセット (最初に評価するセットの左側にある|セット) が一致セットになります。

これにより、(a|b)*|(ab)+can は just と一致するためa、単に一致します。このグループは の左側にあるため、最初に評価されます。(a|b)a|

于 2012-10-17T17:31:40.670 に答える
1

翻訳しましょう。

  1. (a|b)*(ab)+意味:

    • 0 個以上の ("a" または "b")
    • 1 つ以上の「ab」が続く

    したがって、、、、、のいずれかabが機能babaabます。しかし、、、、、、そうではありません。ababaaababbababaaabbbbbba<empty>

  2. (a|b)*|(ab)+意味:

    • 0 個以上の ("a" または "b")
    • または、1 つ以上の「ab」によって

    したがって、上記のすべてが最初の alternative に一致するため、一致し(a|b)*ます。たまたま2 番目の選択肢と一致するものもあります(ab)+が、実際には問題ではありません。2 番目の選択肢は最初の選択肢によって完全にカバーされており、チェックされることはありません。

于 2012-10-17T17:30:53.523 に答える
1
(a|b)*|(ab)+

(a|b)*は、a または b の 0 個以上の文字を意味します。つまり、「a」と「b」の任意の組み合わせです。(ab)+1 つ以上の 'ab' を意味します。を間に置いて、|どちらか一方を意味します。そうです、「a」だけでも機能します。

(a|b)*(ab)+

最初の部分は同じで、'a' または 'b' の 0 個以上の文字です。ただし、「|」はありません これは連結を意味します。したがって、一連の「a」と「b」の後に、1 つ以上の「ab」が続きます。

これを読むことをお勧めします。正式な正規表現の 3 つの操作について説明します: kleene star、altercation、および concatenation です。現実世界の正規表現エンジンがどのように機能するかについても同様です。

于 2012-10-17T17:31:27.033 に答える