В чем разница между (a + b) * и (a * b *) *? - PullRequest
2 голосов
/ 07 февраля 2020

Я предполагаю Σ = {a, b}. Я хочу узнать, что RE означает Σ * (Σ * означает множество всех возможных строк в алфавите Σ)

Я придумаю следующие буксирные RE (регулярные выражения)

(a+b)*
(a*b*)*

Тем не менее, я не могу решить, какой RE правильный или оба плохие. Поэтому, пожалуйста, скажите мне правильный ответ.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

В обычной грамматике регулярного выражения (a+b)* означает ноль или более любой последовательности, которая начинается с a, затем имеет ноль или более a, затем b. Это исключает такие вещи, как baa (не начинается с a), abba и a (должен быть один точно b после каждой a группы), это неверно.

(a*b*)* означает ноль или более любой последовательности, которая содержит ноль или более a, за которым следует ноль или более b. Это более правильно, так как учитывает либо начальный символ, любой порядок и количество символов, и так далее. Это также позволяет пустую строку, которая, я уверен, должна быть разрешена Σ* (но я оставлю это на ваше усмотрение).

Однако, может быть, лучше выбрать гораздо более простой [ab]* (или [ab]+ в маловероятном случае, если вы считаете пустую строку недействительной). В основном это ноль (один для варианта +) или более любого символа, взятого из класса [ab].


Однако, возможно , , так как вы используя Σ, вы, возможно, обсуждаете формальную теорию языка (где Σ распространено), а не грамматику регулярных выражений (где это не так).

Если это в случае , тогда вы должны понимать, что существуют варианты формального языка, в которых выражение a | b (фактически [ab] в грамматике регулярных выражений) вместо этого можно представить как одно из a ∪ b, a ∨ b или a + b, с каждым из этих символов оператора, представляющих «логический или».

Это будет означать, что (a+b)* на самом деле правильно (так как это эквивалентно грамматике регулярных выражений, которую я дал выше) для того, что вам нужно, так как в основном означает любой символ из набора {a, b}, повторяется ноль или более раз.

Кроме того, это также , охватываемое вашим параметром (a*b*)*, но почти всегда лучше выбрать самый простой который делает работу: -)

1 голос
/ 07 февраля 2020

Оператор + обычно используется для обозначения объединения (|, "или") в регулярных выражениях Academi c, а не "один или несколько", как это обычно происходит в неакадемических c настройках ( например, большинство реализаций регулярных выражений).

Итак, a+b означает [ab] или a|b, поэтому (a+b)* означает любую строку длиной 0 или более, содержащую любое количество a s и b s в любом порядке.

Аналогично, (a*b*)* также означает любую строку длиной 0 или более, содержащую любое количество a s и b s в любом порядке.

Два выражения - это разные способы выражения одного и того же языка.

...