RegExp在查询中匹配电话号码格式的问题

用户名

我正在尝试为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似乎也不返回任何内容

dgig

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

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 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章