mysql - 从正则表达式收到错误 'repetition-operator operand invalid'(错误#1139)

标签 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*$';

问题是,每次运行代码时,都会收到错误:

错误代码:1139。从正则表达式中收到错误“重复运算符操作数无效”

提前致谢。

最佳答案

您使用的正则表达式至少有两个问题: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+ 个空格
  • \\(? - 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 + 一个可选的 ) + 一个可选的空格 + 一个从 19 的数字 + 3 或 2 位数字 + 一个可选空格+4位数字
    • | - 或
    • 0[1-8][0-9]{3}\\)? ?[1-9][0-9]{2} ?[0-9]{3} - 0 + 一个从 18 + 3 位数字 + 可选的 ) + 可选的空格 + 从 19 的数字 + 2 位数字 +可选空格 + 3 位数字
  • [[:space:]]* - 0+ 个空格
  • $ - 字符串结尾

关于mysql - 从正则表达式收到错误 'repetition-operator operand invalid'(错误#1139),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39369092/

相关文章:

MySQL LEFT JOIN ON 条件的顺序

PHP 注册表单不工作

mysql - 我将 WHERE 子句与 OR 一起使用,但出现错误

ruby-on-rails - 如何在 ruby​​-on-rails 中为 3 位数字编写验证?

regex - 在 PHP 打开或关闭标记之前检查空行

sql - 获取字符串中的第二个单词,直到遇到 '(' 或 ' '

mysql - 检查 MySQL 中日期范围的重叠

mysql - 需要调整哪些设置来改进包含大量列和少量联接的 SELECT?

php - 从php中的字符串中提取正 float 和负 float

C#正则表达式提取键值