【问题标题】:Oracle REGEXP_LIKE match non-numeric characterOracle REGEXP_LIKE 匹配非数字字符
【发布时间】:2015-05-30 16:23:21
【问题描述】:

我的数据库中有一组具有 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.

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

【问题讨论】:

    标签: sql regex oracle regexp-replace


    【解决方案1】:

    你可以在这里使用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)');`
    

    【讨论】:

    • 我可以在您发布的演示中看到这有效,但在 oracle 中“:>:”不被识别为字符类。不过还是谢谢你的回答!
    • Oracle 正则表达式不支持单词边界,无论是常规排序 (\b) 还是 POSIX 样式([[:<:]][[:>:]])。
    【解决方案2】:

    设置样本数据:

    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 结尾的值。

    【讨论】:

    • 谢谢!我看到我必须在我的正则表达式中明确指定行尾才能获得我想要的行为。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 2013-05-12
    • 2020-08-28
    • 1970-01-01
    • 2011-11-25
    • 2012-12-06
    • 1970-01-01
    • 2017-05-26
    相关资源
    最近更新 更多