Проверка наличия слова в строке с помощью Oracle REGEXP_SUBSTR

Я попытался проверить строку на наличие определенного слова по регулярному выражению '\b<word>\b', но похоже, что \b привязка не работает в REGEXP_SUBSTR:

Например. для проверки слова ABC:

SELECT  REGEXP_SUBSTR ('A, AB, ABC,ABCD', '\bABC\b') FROM DUAL;

но результат здесь (ноль). Что я делаю неправильно?


person shaf    schedule 31.05.2017    source источник
comment
Что вы хотите сделать с \b? Вам нужно получить только ABC, исключая, например, xABC, ABCy, xABCY?   -  person Aleksej    schedule 31.05.2017
comment
Да, я хочу проверить слово целиком — в моем случае слово «ABC», а не строку «ABC» как часть слова «ABCD».   -  person shaf    schedule 31.05.2017
comment
Регулярное выражение Oracle не поддерживает конструкцию \b. Вам нужно использовать (^|[^[:alnum:]_])word($|[^[:alnum:]_]) или (^|\W)word($|\W)   -  person Wiktor Stribiżew    schedule 21.09.2018
comment
Возможный дубликат Oracle REGEXP_LIKE и границ слов   -  person Wiktor Stribiżew    schedule 21.09.2018


Ответы (1)


Чтобы проверить, содержит ли строка заданное слово в точности, и предполагая, что единственными символами, которые могут разделять два слова в строке, являются запятая и пробел, все, что вам нужно сделать, это обработать эти два символа, даже думая до начала и конец строки:

SELECT 1 from dual
where REGEXP_LIKE ('A, AB, ABC,ABCD', '(^| |,)ABC(,|$| )')

Как это устроено:

(^| |,) означает, что перед словом может стоять ничего (начало строки), запятая или пробел;

аналогично (,|$| ) означает, что за словом может следовать запятая, ничего (конец строки) или пробел

person Aleksej    schedule 31.05.2017
comment
Спасибо, это работает! Но почему я не могу использовать якорь \b для сопоставления позиций границы слова: \bABC\b? - person shaf; 31.05.2017