Можете ли вы интерпретировать это регулярное выражение - PullRequest
2 голосов
/ 20 марта 2012

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

Запрос

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 ]

7 голосов
/ 20 марта 2012

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

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

2 голосов
/ 20 марта 2012

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

  • Использование 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...