Oracle REGEXP_LIKE匹配非数字字符

时间:2015-03-26 15:11:22

标签: sql regex oracle regexp-replace

我的数据库中有一组行,其中包含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.

我是一个有正则表达式的初学者,但根据我的研究,似乎上面应该实现我正在寻找的行为。有人能告诉我他们有什么问题吗?

2 个答案:

答案 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)');`