REGEX用于完整的单词匹配

时间:2011-10-27 13:18:48

标签: sql regex oracle oracle10g oracle11g

好的我很困惑(显然)

我正在尝试返回行(来自Oracle),其中文本字段包含完整的单词,而不仅仅是子字符串。

一个简单的例子就是“我”这个词。

向我显示字符串中包含单词“I”的所有行,但不是简单地将“I”作为'%I%'

中的子字符串放在哪里

所以我写了我认为简单的正则表达式:

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

期望我应该用字边界检测到。我没有得到任何结果(或者说每行的结果为0。

我的期望:

  • '我是管理员' - > 1
  • '我是管理员' - > 0
  • '我是管理员' - > 1
  • '这是臭名昭着的管理员' - > 0
  • '管理员,我是' - > 1

是不是/ b应该按字边界找到包含的字符串?

TIA

3 个答案:

答案 0 :(得分:8)

我相信你的正则表达式不支持\ b:

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

因此你可以这样做:

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

至少要确保你的“单词”被一些空格分隔,或者它是整个字符串。

答案 1 :(得分:4)

Oracle不支持单词边界锚点,但即使这样做,也不会得到所需的结果:\b匹配字母数字字符和非字母数字字符。 alnum的确切定义在实现之间有所不同,但在大多数风格中,它是[A-Za-z0-9_](.NET也考虑Unicode字母/数字)。

因此I%I%周围有两个边界。

如果您将单词边界定义为“单词之前/之后的空格”,则可以使用

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

也适用于字符串的开头/结尾。

答案 2 :(得分:1)

Oracle native regex support有限。 \b<不能用作字词分隔符。您可能需要Oracle Text进行单词搜索。