Можете ли вы интерпретировать это регулярное выражение

Я новичок в регулярных выражениях, во время обучения я запутался в некоторых базовых, не могли бы вы интерпретировать это выражение

запрос

SELECT REGEXP_REPLACE('Having fun with', '([a-z])+', 'A') FROM dual;

Результат:

HA A A

запрос

SELECT REGEXP_REPLACE('Having fun with', '([a-z])*', 'A') FROM dual;

Результат:

AHAA AA AA

Я не могу понять главное различие между + и * согласно этим запросам и их результатам.

2 ответа

+ - соответствует 1 или более строчных букв. Ex. со спичками в скобках: H [aving] [fun] [with]

* - соответствует 0 или более строчных букв. Пример: со спичками (также пустыми строками) в скобках: []H[aving][] [fun][] [with][]

Не все механизмы регулярных выражений работают таким образом, но механизм регулярных выражений Oracle позволит пустому совпадению следовать совпадению не-0-ширины. Однако все движки регулярных выражений должны совпадать в начале строки.

  • Используя vim, с 'noignorecase', :s/[a-z]*/A/g ==> AHA A A,
  • Используя Perl, my $in = 'Having fun with'; $in =~ s/[a-z]*/A/g; ==> AHAA AA AA,

* жадный и будет пытаться сопоставить как можно больше элементов, так же, как +, но * позволяет сопоставить 0 вхождений (т. е. пустую строку).

Состояние машины:

  • Мы находимся в начале строки, у нас есть совпадение, максимально возможная длина равна 0. H не соответствует.
  • Мы находимся в позиции s+1, у нас есть совпадение, максимально возможная длина равна 5 (aving).
  • Мы находимся в позиции s+6, у нас есть совпадение, длиной 0. <space> не соответствует.
  • Мы находимся в позиции s+7, у нас есть совпадение, длиной 3 (fun)
  • Мы находимся в позиции s+10, у нас есть совпадение, длиной 0. <space> не соответствует.
  • Мы находимся в позиции s+11, у нас есть совпадение, длиной 4 (with)
  • Мы находимся в позиции s+15 (конец), у нас все еще есть совпадение длины 0.
Другие вопросы по тегам