Oracle Regex表达式再次完全匹配非数字和数字

时间:2012-06-12 08:44:55

标签: regex oracle

如何将Oracle中的电话号码(或任何数字)正确填充为正确的长度,然后是非数字,然后可能再次使用数字?

e.g。

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失败

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

SELECT regextestcol FROM regexptest WHERE REGEXP_LIKE(address,'^[0-9]{3}-[0-9]{4}(\w\d{3})?$');

说明

  • ^开始搜索模式

  • [0-9]{3}-[0-9]{4}匹配由hypen

  • 分隔的三位和四位数字
  • (\w\d{3})?匹配一个字,一个三位数字,可以与?符号一起选项
  • $您的搜索模式结束