1

如何在 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 ok 555-5555x123 ok 555-55551x123 失败 555-55551 失败 555-5555555 失败

4

2 回答 2

4

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

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]如果你想避免这种使用,它也会匹配换行符[^0-9\r\n]

于 2012-06-12T08:50:12.050 回答
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})?匹配一个单词,一个三位数字,两者都可以与?符号一起选择
  • $搜索模式的结尾
于 2012-12-28T07:22:37.913 回答