Пример (a | b) * о Чередовании, я запутался, Почему ab, ba в наборе результатов? - PullRequest
0 голосов
/ 29 апреля 2019

Чередование касается объединения, тогда, если у нас R = {"a"}, S = {"b"}, то R | S будет {"a", "b"}.

Почему ab, ba включены туда в (a | b) *?

Я не понимаю, почему

enter image description here enter image description here

Википедия регулярного выражения

Я думаю, что набор результатов должен быть
(a | b) * = {Ɛ, "a", "b","аа", "бб", "ааа", "ббб", ...}

Ответы [ 4 ]

3 голосов
/ 29 апреля 2019

Выражение a|b соответствует либо a, либо b.

Выражение (a|b)* соответствует, например, (a|b) (a|b) (a|b). В каждой из этих альтернатив вы можете индивидуально выбрать, соответствует ли a или b. Вам не нужно выбирать одно и то же для всех из них.

Вариант «либо a*, либо b*» записывается точно так же, как произносится: a*|b*.

3 голосов
/ 29 апреля 2019

По сути, вы можете думать о (a | b) * как

  • (пустой набор) или
  • (a | b) или
  • (a| б) (а | б) или
  • (а | б) (а | б) (а | б) ...

Из этого ясно, что выборА или В могут чередоваться в последовательности.Надеюсь, это поможет.

2 голосов
/ 29 апреля 2019

* означает ноль или более, это почти как если бы вы написали:

(a|b)(a|b)(a|b)(a|b)(a|b)...

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

. Поэтому он может соответствовать любой комбинации a s и b S

1 голос
/ 29 апреля 2019

В шаблоне (a|b)* используется чередование , чтобы сопоставить либо OR b, и повторить это 0+ раз из-за квантификатора *

Существует пример для записи (a|b)* без чередования, что может быть полезно для выяснения, почему вы получаете эти совпадения:

a*(?:b+a*)*

Чтобы получать только последовательные совпадения, а не смешанные, вы можете использовать обратную ссылку \b(a|b)\1*\b, чтобы повторить то, что было точно зафиксировано в группе. См. демо .

...