【问题标题】:Oracle Regex expression to match exactly non digit then digits againOracle Regex 表达式完全匹配非数字,然后再次匹配数字
【发布时间】:2012-06-15 03:07:52
【问题描述】:

如何在 Oracle 中将电话号码(或任何号码)正则表达式化为完全正确的长度,后跟一个非数字,然后可能又是数字?

例如

SELECT 1 FROM DUAL WHERE 
  REGEXP_LIKE('555-5555x123', '^[0-9]{3,4}[^[:digit:]][0-9]{4}.*$')

数字 555-5555 可以,555-5555x123 可以,但 555-5555123 不行。

可能发生的情况是手指粗的人在输入电话号码时添加了额外的数字而出错(请不要说应该限制输入格式,这不是我的数据),这应该被标记为问题.那么这个例子更像是 555-55545x123。

Oracle REGEXP_LIKE 的测试用例 价值结果 555-5555 好的 555-5555x123 好的 555-55551x123 失败 555-55551 失败 555-5555555失败

【问题讨论】:

  • 为什么555-5555x123 可以?
  • 555-5555x123 没问题,因为 x 之前的电话号码部分定义明确,我可以确定它至少是正确的长度。使用 555-55545x123 我知道出了点问题。

标签: regex oracle


【解决方案1】:
SELECT regextestcol FROM regexptest WHERE REGEXP_LIKE(address,'^[0-9]{3}-[0-9]{4}(\w\d{3})?$');

说明:

  • ^ 搜索模式的开始

  • [0-9]{3}-[0-9]{4} 匹配由连字符分隔的三位和四位数字

  • (\w\d{3})? 匹配一个单词,一个三位数字,两者都可以与 ? 符号一起是可选的
  • $ 搜索模式结束

【讨论】:

    【解决方案2】:

    只需删除表达式末尾的.*,它负责匹配其他内容。

    SELECT 1 FROM DUAL WHERE 
      REGEXP_LIKE('555-5555x123', '^[0-9]{3,4}[^[:digit:]][0-9]{4}$')
    

    这样它确实匹配 3 或 4 个数字,一个非数字和 4 个更多数字。

    {3,4}{4} 是定义您希望允许的位数的量词。只需将它们更改为您需要的值。例如。 {4,} 将匹配 4 个或更多。

    ^ 将正则表达式锚定到字符串的开头,将$ 锚定到结尾。

    更新

    为了确保最后 4 位数字后面没有数字,您可以使用交替

    SELECT 1 FROM DUAL WHERE 
      REGEXP_LIKE('555-5555x123', '^[0-9]{3,4}[^[:digit:]][0-9]{4}($|[^0-9].*$)')
    

    现在,在您的 4 位数字之后,必须是行尾或非数字([^0-9] 是一个否定字符类),然后是任何内容(除了换行符)直到行尾。

    我不知道这对你来说是否重要,但如果你想避免这种使用 [^0-9\r\n][^0-9] 也会匹配换行符

    【讨论】:

    • 但是号码的其余部分很重要,因为我需要它来验证电话号码的长度是否正确且不会太长。我在问题中添加了更清晰的函数结果
    • 太棒了,就是这样 ($|[^0-9].*$)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2020-12-28
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多