得到错误'重复 - 操作员操作数无效'来自regexp(错误#1139)

时间:2016-09-07 11:47:24

标签: mysql regex

我在数据库上有一个列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

提前致谢。

1 个答案:

答案 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 +可选78 +可选的) +可选空格+从1到{的数字{1}} + 3或2位数+可选空格+4位数
    • 9 - 或
    • | - 0[1-8][0-9]{3}\\)? ?[1-9][0-9]{2} ?[0-9]{3} +从01 + 3位+可选8 +可选空格+来自{{的数字1}}到) + 2位数+可选空格+ 3位数
  • 1 - 0+ whitespaces
  • 9 - 字符串结尾