2

質問が言っていることとほぼ同じです。私は思いついた

(ba)?(a + bb + bbbbb + aba)*(ab)?

もっと読みやすいものはありますか?それともこれは間違っていますか?コードに!〜/ bbb /を入れることができるのに、正規表現でこのようなことを実際に行うべきではないことはわかっていますが、これは理論上の演習です。

ありがとう。

明確化のための編集:正規|表現のORビットを表すために使用しておらず+、代わりに使用しています。混乱させて申し訳ありません。

編集2:{a,b}「a」と「b」の文字だけの言語用です。{最小、最大}ではありません。またすみません。

編集3:これは理論クラスの一部であるため、正規表現の基本を扱っているだけです。使用が許可されているのは、+、?、()、および*のみです。{最小、最大)は使用できません。

4

3 に答える 3

1

うーん、こんな感じ?

^(a|(?<!b)b{1,2}(?!b)|b{4,})*$

編集

編集3:これは理論クラスの一部であるため、正規表現の基本を扱っているだけです。使用が許可されているのは、+、?、()、および*のみです。{最小、最大)は使用できません。

Pfff、手を後ろで結ぶことについて話しています...簡単な解決策:それを行うことはできません(そしてそれが機能するための要件^です)、そして私たちはを必要とします。だから、より良い条件を考え出す。後読みと先読みを削除することはできますが、きれいになることはありません(少なくとも、DRYに違反しない限り):$|

^(b|bb|bbbb+)?(a+(b|bb|bbbb+)?)*$
于 2010-08-03T13:43:21.897 に答える
1

I think I have a working regex. Let —which is a notation I invented just now—be the regex that matches zero or more b's, except it won't match three of them. This can be replaced by (ε | b | bb | bbbb+), so don't worry that I'm using magic or anything. Now I think that matching strings can be seen as repeating subpatterns of zero or more a's followed by , which could be (a*b°)*, but you need there to be at least one "a" in between sequences of b's. So your final regex is a*b°(a+b°)*.

Since can match the empty string, the initial a* is superfluous as the a+ can pick up the initial a's just fine, so the regex can be optimized down to b°(a+b°)* (thanks, wrikken).

于 2010-08-03T14:34:15.050 に答える
0

正確に3つのbが連続していない文字列と一致しています。つまり、「aa」、「aba」、「abba」、「abbbbb * a」などのサブストリングを見ていることになります。ここで、外部のaはストリングの最初または最後になり、オーバーラップでき、複数である。これは次のようなことを示唆しています。

(a + ab + abb + abbbbb*)*

文字列の先頭で欠落しているaを説明するために、適切な追加が行われます。繰り返しはたくさんありますが、それが正規表現が基本的な形で機能する方法です。

于 2010-08-03T14:12:01.957 に答える