我在数据库上有一个列phone_number
,条目可能包含多个电话号码。该计划是识别未通过正则表达式验证的条目。
这是我用来实现目标的查询:
SELECT id, phone_number FROM store WHERE phone_number NOT REGEXP '^\s*\(?(020[78]?\)? ?[1-9][0-9]{2,3} ?[0-9]{4})|(0[1-8][0-9]{3}\)? ?[1-9][0-9]{2} ?[0-9]{3})\s*$';
问题是,每次运行代码时,都会出错:
Error Code: 1139. Got error 'repetition-operator operand invalid' from regexp
提前致谢。
答案 0 :(得分:0)
您正在使用的正则表达式至少有两个问题:1)转义应该加倍,以及2)有|
分隔的2个组使得^
和$
分别申请两个分支。
'^\s*\(?(020[78]?\)? ?[1-9][0-9]{2,3} ?[0-9]{4})|(0[1-8][0-9]{3}\)? ?[1-9][0-9]{2} ?[0-9]{3})\s*$'
^--------------------------------------^ ^------------------------------------------^
您可以使用
'^[[:space:]]*\\(?(020[78]?\\)? ?[1-9][0-9]{2,3} ?[0-9]{4}|0[1-8][0-9]{3}\\)? ?[1-9][0-9]{2} ?[0-9]{3})[[:space:]]*$'
故障:
^
- 字符串开头[[:space:]]*
- 0+ whitespaces \\(?
- 1或0 (
个字符(020[78]?\\)? ?[1-9][0-9]{2,3} ?[0-9]{4}|0[1-8][0-9]{3}\\)? ?[1-9][0-9]{2} ?[0-9]{3})
- 一个匹配2个备选方案的轮换组:
020[78]?\\)? ?[1-9][0-9]{2,3} ?[0-9]{4}
- 020
+可选7
或8
+可选的)
+可选空格+从1
到{的数字{1}} + 3或2位数+可选空格+4位数9
- 或|
- 0[1-8][0-9]{3}\\)? ?[1-9][0-9]{2} ?[0-9]{3}
+从0
到1
+ 3位+可选8
+可选空格+来自{{的数字1}}到)
+ 2位数+可选空格+ 3位数1
- 0+ whitespaces 9
- 字符串结尾