В обычной грамматике регулярного выражения (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*)*
, но почти всегда лучше выбрать самый простой который делает работу: -)