Oracle REGEXP_LIKE和字边界

Gre*_*lds 30 regex oracle word-boundary

我遇到了与REGEXP_LIKE匹配单词边界的问题.以下查询返回单行,如预期的那样.

select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');
Run Code Online (Sandbox Code Playgroud)

但我也希望在字边界上匹配.因此,添加"\ b"字符​​会给出此查询

select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');
Run Code Online (Sandbox Code Playgroud)

运行此返回零行.有任何想法吗?

Ren*_*ger 49

我相信你想试试

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

因为\b此列表中没有出现:http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm#i1007670

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

更新(3年后+)...... 碰巧,今天我需要这个功能,在我看来,正则表达式更好(^|\s|\W)test($|\s|\W)(Oracle中缺少\ b正则表达式特殊字符).

  • 在你更新的正则表达式中,`\ s`字符类是多余的,因为你包括`\ W`(一个字符类是`\ s`的超集). (6认同)

Wik*_*żew 7

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

(^|\W)test($|\W)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节

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

请注意,\W匹配除字母、数字和_. 如果你想匹配一个可以出现在中间_(下划线)的单词,你需要一个有点不同的模式:

(^|[^[:alnum:]])test($|[^[:alnum:]])
Run Code Online (Sandbox Code Playgroud)

所述[^[:alnum:]]取反括号表达式匹配任何炭但字母数字字符,并且匹配_,所以,_test_将与该模式匹配。

请参阅此正则表达式演示