【问题标题】:Issue with RegExp matching a phone number format in queryRegExp 在查询中匹配电话号码格式的问题
【发布时间】:2015-07-11 08:36:04
【问题描述】:

我正在尝试为 MySQL 编写一个 RegExp,它只会返回以下 3 种电话格式:

+1 000-000-0000 x0000

+1 000-000-0000

000-000-0000 x0000

000-000-0000

所以基本上:

+[任意位数][空格][任意三位数]-[任意三位数]-[任意四位数][空格][x][任意位数]

国家代码和扩展名是可选的。我是新手,但我认为这应该至少返回一个数字,包括国家代码和扩展选项,但是当我执行它时我得到 0 个结果。

\x2B[0-9]*\x20[0-9]{3}\-[0-9]{3}\-[0-9]{4}\x20x[0-9]+|
\x2B[0-9]*\x20[0-9]{3}\-[0-9]{3}\-[0-9]{4}|
[0-9]{3}\-[0-9]{3}\-[0-9]{4}

有人可以告诉我为什么我的数据库中有 +1 555-555-5555 x5555 这样的记录,但我得到 0 个结果。另外,使国家代码和扩展名是可选的语法是什么

请注意,我使用 [0-9] 是因为我正在查询一个文本字段,并且即使我的条件很简单,例如 \d*,\d 似乎也没有返回任何内容

【问题讨论】:

  • 你为什么使用\x2B 而不是仅仅转义+:\+?有什么特别的原因吗?以及为什么要转义空格(即\x20 而不是``)
  • 基本上是因为我不知道你可以那样做 :)

标签: mysql regex


【解决方案1】:

因此,作为共同努力,答案就在这里:

SELECT * FROM table 
WHERE field 
REGEXP '(^[+][0-9]+\ )?([0-9]{3}\-[0-9]{3}\-[0-9]{4})(\ x[0-9]+$)?'

首先是不允许使用 mysql 中的字符代码(x20、x2B 等)。下一个重要步骤是使用括号和“?”使不同部分可选的令牌。

============

我认为问题在于缺少括号来定义子表达式。

这似乎对我有用,虽然它看起来并不漂亮:

SELECT '+1 000-000-0000 x0000' REGEXP '^(([+][0-9]*\[ ][0-9]{3}\-[0-9]{3}\-[0-9]{4}[ ]x[0-9]+)|())$'

也一样

SELECT '' REGEXP '^(([+][0-9]*\[ ][0-9]{3}\-[0-9]{3}\-[0-9]{4}[ ]x[0-9]+)|())$'

和(普通电话号码)一样:

SELECT '555-555-5555' REGEXP '^(([+][0-9]*\[ ])*[0-9]{3}\-[0-9]{3}\-[0-9]{4}([ ]x[0-9]+)*)|())$'

编辑:(与上面相同的正则表达式,但针对带有国家代码和扩展名的版本进行测试):

SELECT '+1 555-555-5555 x55' REGEXP '^(([+][0-9]*\[ ])*[0-9]{3}\-[0-9]{3}\-[0-9]{4}([ ]x[0-9]+)*)|())$'

当我尝试你的:

SELECT '+1 000-000-0000 x0000' REGEXP '\x2B[0-9]*\x20[0-9]{3}\-[0-9]{3}\-[0-9]{4}\x20x[0-9]+|' 

我明白了:

1139 - Got error 'empty (sub)expression' from regexp 

【讨论】:

  • 我发现你不能在mysql中使用chr代码。我需要逃跑。这就是我最终得到的似乎可行的结果: ^\\+[0-9]+\ |^[0-9]{3}\-[0-9]{3}\-[0-9 ]{4}$|\ x[0-9]+$
  • 如果这是您遇到的问题,请发布详细的答案并接受它。
  • 我还没有想出完整的答案。我需要知道如何将国家代码和扩展名设为可选。我现在拥有的基本上是这三个中的任何一个。
  • 我的第三个 SELECT 显示,不是吗?确实如此。
  • @dgig 原来我在寻找(表达)?对于任何阅读()分组并添加尾随的人?使其成为可选的。我终于能够用以下表达式解决它: SELECT * FROM table WHERE field REGEXP '(^[+][0-9]+\ )?([0-9]{3}\-[0- 9]{3}\-[0-9]{4})(\x[0-9]+$)?'如果不浏览您的示例,我将无法到达那里,所以如果您想更新您的答案,我会选择它作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多