1 (изменено: im2002, 2017-11-08 17:48:38)

Тема: JS: Исп. символа "*" в RegExp

Никак не могу разобраться как действуют символы * и ? в рег. выражениях...
вот цитата из учебника JavaScript_(изд._O_Reilly):
" Будьте осторожны при использовании символов повторения * и ?. Они могут со
ответствовать отсутствию указанного перед ними шаблона и, следовательно, от
сутствию символов. Например, регулярному выражению a* соответствует
строка "bbbb", поскольку в ней нет символа a!"

WScript.Echo("bbbb".replace(/a*/,"Y"));		// предполагал, что результатом будет Y, т.к. вся строка соотв. шаблону, но результат Ybbbbb?!	

2

Re: JS: Исп. символа "*" в RegExp

WScript.Echo ("bbbb".replace(/b.*/g, "Y"));

3

Re: JS: Исп. символа "*" в RegExp

929151
Подобрать выражение для такого простого случая как я описал (чтобы результатом был один символ "Y") не проблема. Хочу понять как "правильно рассуждать" чтоб составлять такие выражения результат которых будет ожидаем, т.к. не пойму как действуют символы * и ?. Может есть ссылка на доходчивый материал где объясняются шаблоны и рег. выр. для JS?

4

Re: JS: Исп. символа "*" в RegExp

Фридл - Регулярные выражения. Regexp.3ed.2008.djvu
Обсуждение кванторов.

5

Re: JS: Исп. символа "*" в RegExp

a* — это ноль или больше символов "а", а не какие-то другие символы. Т.е. ему соответствует пустое место или любое количество символов "а".

а? — это пустое место или один символ "а".

"b" — это не отсутствие символа "а", а символ "b". А вот пустота до и после него соответствует отсутствию любых символов, в том числе и "а".

6

Re: JS: Исп. символа "*" в RegExp

спасибо всем:)

7

Re: JS: Исп. символа "*" в RegExp

Очень часто выручают.

  • RegexBuddy

  • RegexMagic

8

Re: JS: Исп. символа "*" в RegExp

YMP
По поводу "пустоты" ещё вопрос.

WScript.Echo("dab".replace(/a*/g, "Y"));		// ожидал YdYbY, имеем по факту: YdYYbY

пытался логически "подогнать" под фактический результат рассуждал так:

1) "пустота" перед символом "d" соотв. шаблону (первый "Y"), далее "d". рез. = Yd
2) после "d" идёт символ "а", кот. также соотв. (второй "Y"),  рез. = Y
3) перед символом  "b" стоит "а", кот. также соотв. (третий "Y"),  рез. = Y
4) далее идёт символ "b" и "пустота" за ним соотв. шаблону (четвёртый "Y") рез. = bY
5) итог: Yd+Y+Y+bY = YdYYbY

Хотел спросить: так обосновать правильно?

9

Re: JS: Исп. символа "*" в RegExp

im2002 пишет:

2) после "d" идёт символ "а", кот. также соотв. (второй "Y"),  рез. = Y
3) перед символом  "b" стоит "а", кот. также соотв. (третий "Y"),  рез. = Y

Но тогда и без звёздочки получалось бы YY в середине, но получается Y. Так что, наверно, тут учитывается пустота перед "b". А после "d" пустота не считается, т.к. там стоит "a".

Или, может быть, наоборот. Учитывается пустота после "d", а дальше идёт "a", соответственно перед "b" уже не пустота. И получается два совпадения, а не три, как тоже можно было бы подумать.

10

Re: JS: Исп. символа "*" в RegExp

"dab".replace(/a*/g, "Y")

Квантификатор * - жадный, то есть он захватывает максимально возможную последовательность. В данном случае это могут быть
-- пустая строка или
-- сколько-то букв a

Для строки dab из примера это 4 варианта
-- пустота перед d - превращается в первую Y, результат - Ydab
-- символы a после d - превращается во вторую Y, результат - YdYb
-- пустота перед b - превращается в третью Y, результат - YdYYb
-- пустота после b - превращается в четвертую Y, результат - YdYYbY

( 2 * b ) || ! ( 2 * b )