我正在尝试为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似乎也不返回任何内容
因此,作为共同的努力,答案就在这里:
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] 删除。
我来说两句