Путаница относительно оператора * в регулярном выражении


Я знаю, что оператор * означает любое число вхождений предыдущего символа / с.

Таким образом, выражение ab* будет генерировать строки типа "ab", "abab" и т. д. Но он также генерирует строку "a", и я не понимаю этой логики. Является ли это чем-то, что оператор * рассматривает только 1 символ, предшествующий ему для операции. Таким образом, с помощью этой логики * операция применяется только к 'b' в упомянутом примере, и b повторяется 0 раз, так что результирующая строка" a " генерируется. Пожалуйста помощь.

Edit: ab* не будет генерировать строки типа "abab", как я упоминал выше. Он генерирует только строки типа ab, abb, abbb и т. д.

2 2

2 ответа:

Таким образом, выражение ab* будет генерировать строки типа "ab", "abab" и т. д.

Это неверно. ab* только совпадения a, ab, abb, abbb, abbbb, ...

Является ли это чем-то, что оператор * рассматривает только 1 символ, предшествующий ему

Точно.

Если вы хотите применить * к ab, то вы должны сгруппировать его: (ab)*

Я знаю, что оператор * означает любое число вхождений предыдущего символа / с.

Оператор

Означает 0 или более вхождений предыдущего выражения . В вашем случае выражение перед * равно b (так как в регулярном выражении каждый символ является выражением). Так что ab* будет соответствовать

a (0 "b" expressions)
ab (1 "b" expressions)
abbb (2 "b" expressions)
abab (1 "b" expressions followed by extra "ab", but note that `^ab*$` will not match `abab` since it is contained to the start/end of line.)

Если вы хотите сопоставить ab ноль или более раз, вы должны обрабатывать ab как выражение, используя скобки, такие как (ab)*.

Эта часть Википедии объясняет это лучше меня.