好的我很困惑(显然)
我正在尝试返回行(来自Oracle),其中文本字段包含完整的单词,而不仅仅是子字符串。
一个简单的例子就是“我”这个词。
向我显示字符串中包含单词“I”的所有行,但不是简单地将“I”作为'%I%'
所以我写了我认为简单的正则表达式:
select REGEXP_INSTR(upper(description), '\bI\b') from mytab;
期望我应该用字边界检测到。我没有得到任何结果(或者说每行的结果为0。
我的期望:
是不是/ b应该按字边界找到包含的字符串?
TIA
答案 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进行单词搜索。