2011-10-27 55 views
3

行,所以我很困惑(显然)正则表达式完整的单词匹配

我试图返回行(甲骨文),其中一个文本字段包含一个完整的字,而不仅仅是子。

一个简单的例子是单词'我'。

给我看的字符串包含单词“我”的所有行,而不是简单地在那里“我”是一个串的地方,如'%I%'

所以我写了什么,我认为将是一个简单的正则表达式:

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

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

我的期望:

  • '我是管理员 - > 1
  • '我是管理员' - > 0。
  • '我是管理员' - > 1
  • '这是臭名昭著的管理员' - > 0
  • '的adminisrtrator,TIS I' - > 1

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

tia

+0

[Oracle REGEXP \ _LIKE和单词边界](http:// stackoverflow。com/questions/7567700/oracle-regexp-like-and-word-boundaries) – Dzyann

回答

4

Oracle不支持字边界锚定,但即使这样做,也不会得到期望的结果:\b匹配字母数字字符和非字母数字字符。关于alnum的具体定义在不同的实现中有所不同,但是在大多数的版本中,它是[A-Za-z0-9_](.NET也考虑Unicode字母/数字)。

所以在%I%I附近有两个边界。

如果你定义字边界为“空格前/后字”,那么你可以使用

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

这也将在字符串的开始/结束工作。

+2

谢谢。这个变体给了我相当不错的结果:'(^ | \ W)TO(\ W | $)'\ W是'非单词'字符... – Randy

+0

但是,这会提取'%I%'。 –

+0

我的意思是%I%作为您可能在LIKE语句中进行比较的一个示例...对于任何混淆抱歉。 – Randy