我的数据库中有一组行,其中包含VARCHAR2列值,如下所示:tac903.2,tac903.24,tac903.2a,tac903.2b
如果搜索表达式中的最后一个字符是数字,我想创建一个不匹配的正则表达式。所以当我搜索" tac903.2"我想只匹配:tac903.2,tac903.2a和tac903.2b。这应该很简单,但我没有从我的正则表达式获得所需的行为:
REGEXP_LIKE(col, 'tac903.2[a-z]?'); //This is matching the tac903.24 record.
REGEXP_LIKE(col, 'tac903.2[^0-9]?'); //This also is matching the tac903.24 record.
我是一个有正则表达式的初学者,但根据我的研究,似乎上面应该实现我正在寻找的行为。有人能告诉我他们有什么问题吗?
答案 0 :(得分:4)
设置样本数据:
create table temp_matches (
rec varchar2(10)
);
insert into temp_matches values ('tac903.2');
insert into temp_matches values ('tac903.2a');
insert into temp_matches values ('tac903.2b');
insert into temp_matches values ('tac903.24');
insert into temp_matches values ('2');
insert into temp_matches values ('a');
查询:
select *
from temp_matches
where REGEXP_LIKE(rec, '(.)*[^0-9]$');
结果:
tac903.2a
tac903.2b
a
$表示该行的结尾,因此我们只查找不以0-9结尾的任何值。
答案 1 :(得分:0)
您可以在此处使用word boundary
[[:>:]]
。
像这样REGEXP_LIKE(col, 'tac903.2[a-z]?[[:>:]]');
参见演示。
http://www.sqlfiddle.com/#!9/940fd/2/0
编辑:
`REGEXP_LIKE(col, 'tac903.2[a-z]?(\s|$|\W)');`