REGEX для полного соответствия слов - PullRequest
3 голосов
/ 27 октября 2011

ОК. Итак, я в замешательстве (очевидно)

Я пытаюсь вернуть строки (из Oracle), где текстовое поле содержит полное слово, а не только подстроку.

простым примером является слово «I».

Покажите мне все строки, где строка содержит слово «I», но не просто где «I» - это подстрока где-то, как в '%I%'

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

select REGEXP_INSTR(upper(description), '\bI\b') from mytab;

, ожидая, что меня обнаружат по границам слов.Я не получаю результатов (или, скорее, результат 0 для каждой строки.

что я ожидаю:

  • 'Я - Администратор' -> 1
  • 'Iя администратор -> 0
  • «Я администратор» -> 1
  • «Это печально известный администратор» -> 0
  • 'Администратор, тисI '-> 1

Разве / b не должен находить содержащуюся строку по границе слова?

tia

Ответы [ 3 ]

8 голосов
/ 27 октября 2011

Я считаю, что \ b не поддерживается вашим видом регулярного выражения:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007670

Поэтому вы можете сделать что-то вроде:

(^|\s)word(\s|$)

Чтобы впо крайней мере, убедитесь, что ваше «слово» разделено пробелами или содержит целую строку.

4 голосов
/ 27 октября 2011

Oracle не поддерживает привязки к границам слов, но даже если бы это было так, вы бы не получили желаемого результата: \b соответствует буквенно-цифровому символу и не буквенно-цифровому символу.Точное определение того, что представляет собой alnum, отличается в разных реализациях, но в большинстве разновидностей это [A-Za-z0-9_] (.NET также учитывает буквы / цифры Unicode).

Таким образом, существуют две границы вокруг I в %I%.

Если вы определяете границу слова как «пробел перед / после слова», то вы можете использовать

(^|\s)I(\s|$)

, который также будет работать в начале / конце строки.

1 голос
/ 27 октября 2011

Поддержка регулярных выражений Oracle ограничена. \b или < нельзя использовать в качестве разделителей слов. Возможно, вам понадобится Oracle Text для поиска слов.

...