Oracle REGEXP_LIKE и границы слов - PullRequest
29 голосов
/ 27 сентября 2011

У меня проблема с сопоставлением границ слов с REGEXP_LIKE. Следующий запрос возвращает одну строку, как и ожидалось.

select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');

Но я хочу сопоставить и границы слов. Таким образом, добавление символов "\ b" дает этот запрос

select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');

Выполнение этого возвращает ноль строк. Есть идеи?

Ответы [ 3 ]

47 голосов
/ 27 сентября 2011

Я полагаю, вы хотите попробовать

 select 1 from dual 
  where regexp_like ('does test work here', '(^|\s)test(\s|$)');

, поскольку \b не отображается в этом списке: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007670

\s гарантирует, что тест начинается и заканчиваетсяв пропусках.Однако этого недостаточно, поскольку строка test также может появляться в самом начале или конце сопоставляемой строки.Поэтому я использую альтернативу (обозначенную |) ^ для начала строки и $ для конца строки.

Обновление (через 3 года +) ... Так получилось, что сегодня мне понадобилась эта функциональность, и мне кажется, что еще лучше регулярное выражение (^|\s|\W)test($|\s|\W) ( Отсутствующий специальный символ \ b регулярного выражения в Oracle ).

1 голос
/ 21 сентября 2018

Самое короткое регулярное выражение, которое может проверить целое слово в Oracle, -

(^|\W)test($|\W)

См. Демоверсию regex .

Детали

  • (^|\W) - группа захвата, соответствующая либо
    • ^ - начало строки
    • | - или
    • \W - несловесный символ
  • test - слово
  • ($|\W) - группа захвата, соответствующая либо
    • $ - конец строки
    • | - или
    • \W - несловесный символ.

Обратите внимание, что \W соответствует любым символам, кроме букв, цифр и _. Если вы хотите сопоставить слово, которое может появляться между _ (подчеркивание), вам нужен немного другой шаблон:

(^|[^[:alnum:]])test($|[^[:alnum:]])

Выражение [^[:alnum:]] в скобках соответствует любому символу, кроме буквенно-цифровых символов, и соответствует _, поэтому _test_ будет сопоставляться с этим шаблоном.

См. это демо регулярных выражений .

0 голосов
/ 11 февраля 2015

В общем, я бы придерживался решения Рене, за исключением случаев, когда нужно, чтобы совпадение было нулевой длины.т.е. вы не хотите фактически захватывать несловесный символ в начале / конце.

Например, если наша строка равна test test, то (\b)test(\b) будет совпадать дважды, но (^|\s|\W)test($|\s|\W) будет совпадать толькопервое вхождениеПо крайней мере, это так и есть, если вы попытаетесь использовать regexp_substr.

Пример

SELECT regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 1, 'i'), regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 2, 'i') FROM dual;

Возвращает

test |NULL

...