do (a + b) * и (a | B) * производят тот же DFA и тот же выход? В математике, где используется слово «или», мы используем оператор сложения. Значит ли это, что оба выражения эквивалентны?Компилятор DFA (a + b) * vs (a | b) * любая разница между обоими?
ответ
Это зависит от контекста, из которого вы получаете 2 регулярных выражения.
Если вы интерпретируете оба регулярных выражения в синтаксисе двигателей регулярных выражений реального времени, они имеют разные значения, такие как Ed Cottrell explained in his answer. +
означает повторение один или несколько раз. |
означает чередование.
Однако они могут означать одно и то же, если вы интерпретируете +
в (a+b)*
как чередовании после обозначения в большинстве книг по теории автоматов и |
в (a|b)*
как чередовании, следуя обозначения наиболее реальными долговечные двигатели.
No.
(a+b)*
матчи по меньшей мере, один a
следуют через b
, ноль или более раз. Таким образом, для соответствия непустой строке строка должна в какой-то момент содержать ab
.
(a|B)*
a
или b
, ноль или более раз. Он может соответствовать пустой строке, строку всех a
с, строку всех b
с и т.д.
Второе выражение совпадает со всей строкой в следующих примерах: a
, aa
, aaa
, b
, bb
, bbb
и т. д. Первое выражение технически соответствует (потому что строка нулевой длины будет соответствовать), но не соответствует всей строке. Захваченные группы разные.
Таким образом, нет, они не эквивалентны.
спасибо! Так что я пытаюсь написать cfg для обоих. – user3001571
CFG для (a + b) * будет s-> aSbS |^ CFG для (a | b) * будет s-> aS | bS |^ am Я работаю в правильном направлении? – user3001571
@ user3001571: Нет, в обозначении регулярных выражений символ '+' означает «один или несколько», поэтому 'a +' = 'aa *' – Bergi
Ну, если вы говорите, что первое является математическим обозначением, а второе - обозначением регулярных выражений, так что '+' в первом означает то же самое, что '' 'в последнем, то да, они эквивалентны. – Bergi
Я говорю в терминах обозначения регулярных выражений. Пожалуйста, помогите мне с cfg CFG для (a + b) * будет s-> aSbS |^CFG для (a | b) * будет s-> aS | bS |^am Я работаю в правой направление? – user3001571
Нет, '(a + b) *' is 'Repeat (Concat (Repeat (« a »,> = 1),« b »)),> = 0)' – Bergi