2016-04-12 6 views
0

- (Жадность) Это из справочника орканов с регулярными выражениями.
В этом примере:Оракул Регулярное выражение Поведение жадности

select regexp_substr('In the beginning','.+[[:space:]]') from dual; 

Вывод: В
Этого примера показывает алчность выражения оракула, как регулярное выражение двигатель будет на самом деле хочет, чтобы найти больше, он смотрит, может ли он соответствовать еще более отдаленной перспективе символов ,


но во втором примере:

select regexp_substr('bbb',b|bb') from dual; 

Выход: б

почему он не показывает свое первое поведение здесь? Не могли бы вы объяснить это?

Было написано, что оракул игнорирует правило «самого длинного совпадения», поскольку накладные расходы на вычисление всех возможных перестановок и определение того, что является самым длинным, могут быть чрезмерными, но тогда почему он вычисляет максимально возможное совпадение в первом примере?

ответ

2

Объяснение, что «было написано» (из вашего последнего абзаца), является bs (технический термин, не беспокойтесь, если вы не знакомы с ним).

Жадность относится к сопоставлению однотипного совпадения с базовой строкой. Во втором примере есть два шаблона соответствия: «b» и «bb», и они даются как ALTERNATIVES: соответствуют либо первому шаблону, либо второму. Оба шаблона соответствия полностью детерминированы, нет никакой «жадности», привязанной ни к одному из них. При обработке поиск останавливается, как только первый или второй «шаблон соответствия» находится во входной строке. В этом случае сначала выбирается «b», поэтому поиск заканчивается. (И, если вам интересно, FIRST b в 'bbb' соответствует одному и соответствует.)

В поиске с альтернативами сначала строка ввода сопоставляется с альтернативой FIRST всеми возможными способами. Только если совпадение не найдено нигде во входной строке, используется вторая альтернатива. Смотрите, например (и обратите внимание алчность на работе):

SQL> select regexp_substr('bbb', 'b+|bb') as res from dual; 

RES 
--- 
bbb 

EDIT

Однако, если у вас есть жадное согласование только во второй альтернативе, но первая альтернатива находит совпадение, алчность никогда не приходит в играть. Дело в том, что «ПЕРВЫЙ до ВТОРОГО в чередовании» имеет более высокий приоритет, чем «жадность».

SQL> select regexp_substr('bbb', 'b|b*') as res from dual; 

RES 
--- 
b 
+0

Спасибо Mathguy. Теперь это очень ясно. :) – Wolfgang