Oracle REGEXP_LIKE和字边界

时间:2011-09-27 10:32:49

标签: regex oracle word-boundary

我遇到了与REGEXP_LIKE匹配单词边界的问题。以下查询按预期返回单行。

select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');

但我也希望在字边界上匹配。因此,添加“\ b”字符​​会提供此查询

select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');

运行此操作将返回零行。有什么想法吗?

3 个答案:

答案 0 :(得分:47)

我相信你想尝试

 select 1 from dual 
  where regexp_like ('does test work here', '(^|\s)test(\s|$)');

因为此列表中未显示\bhttp://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007670

\s确保测试以空格开始和结束。但是,这还不够,因为字符串test也可能出现在匹配的字符串的开头或结尾。因此,我使用替代(由|^表示字符串的开头,并使用$作为字符串的结尾。

更新(3年后+)...... 碰巧,我今天需要这个功能,在我看来,正则表达式更好(^|\s|\W)test($|\s|\W)The missing \b regular expression special character in Oracle)。

答案 1 :(得分:1)

可以在Oracle中检查整个单词的最短的正则表达式是

(^|\W)test($|\W)

请参见regex demo

详细信息

  • (^|\W)-匹配任一捕获组
    • ^-字符串的开头
    • |-或
    • \W-无字字符
  • test-一个单词
  • ($|\W)-匹配任一捕获组
    • $-字符串结尾
    • |-或
    • \W-非单词字符。

请注意,\W匹配任何字符,但字母,数字和_除外。如果要匹配出现在_(下划线)之间的单词,则需要使用一些不同的模式:

(^|[^[:alnum:]])test($|[^[:alnum:]])

[^[:alnum:]]否定的括号表达式匹配除字母数字字符之外的任何字符,并匹配_,因此,_test_将与此模式匹配。

请参见this regex demo

答案 2 :(得分:0)

一般来说,我会坚持使用René的解决方案,例外情况是你需要匹配为零长度。即你不想在开头/结尾实际捕捉非单词字符。

例如,如果我们的字符串为test test,则(\b)test(\b)将匹配两次,但(^|\s|\W)test($|\s|\W)仅匹配第一次出现。至少,如果你尝试使用regexp_substr,那肯定是这种情况。

实施例

SELECT regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 1, 'i'), regexp_substr('test test', '(^|\s|\W)test($|\s|\W)', 1, 2, 'i') FROM dual;

返回

test |NULL