Можете ли вы интерпретировать это регулярное выражение
Я новичок в регулярных выражениях, во время обучения я запутался в некоторых базовых, не могли бы вы интерпретировать это выражение
запрос
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.