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正则表达式特殊字符).
在 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_
将与该模式匹配。
请参阅此正则表达式演示。