Путаница относительно оператора * в регулярном выражении
Я знаю, что оператор * означает любое число вхождений предыдущего символа / с.
Таким образом, выражение ab* будет генерировать строки типа "ab", "abab" и т. д. Но он также генерирует строку "a", и я не понимаю этой логики. Является ли это чем-то, что оператор * рассматривает только 1 символ, предшествующий ему для операции. Таким образом, с помощью этой логики * операция применяется только к 'b' в упомянутом примере, и b повторяется 0 раз, так что результирующая строка" a " генерируется. Пожалуйста помощь.
Edit: ab* не будет генерировать строки типа "abab", как я упоминал выше. Он генерирует только строки типа ab, abb, abbb и т. д.
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)*
.Эта часть Википедии объясняет это лучше меня.