【问题标题】:regexp match for a number between 2 patterns正则表达式匹配两个模式之间的数字
【发布时间】:2019-10-03 10:04:55
【问题描述】:

我正在尝试在我的 SQL 查询中添加一个正则表达式来查找字符串中的特定数字。

这个搜索的参数应该是:

  • 字符串开头的数字
  • 字符串末尾的数字
  • + 或 | 之间的数字人物。 例如查找字符串 3+26|2+12 是否包含数字 2

我能够编写一个适用于 PHP 的正则表达式: (?<=^|\+|\|)(2)(?=\||\+|$) 但是我发现 MySQL 不支持这种正则表达式。

任何帮助将其转换为与 MySQL 兼容的正则表达式?

谢谢。

【问题讨论】:

  • MySQL v8+ 支持这种语法。你有哪个版本?如果您只需要返回与这种模式匹配的所有记录,请使用(^|[+|])2([|+]|$)

标签: mysql regex


【解决方案1】:

请注意,在 MySQL v8+ 中,您可以使用lookarounds 和

(?<=^|[+|])2(?=[|+]|$)

适用于 ICU 正则表达式库。

但是,您可以简单地在组内使用交替。这种模式也适用于旧版 MySQL:

(^|[+|])2([|+]|$)

该模式将返回所有包含匹配文本的记录

  • (^|[+|]) - 记录开始,+|
  • 2 - 2 字符
  • ([|+]|$) - 记录结束,+|

【讨论】:

  • 感谢您的解释,这正是我所需要的!
【解决方案2】:

跳出框框思考...

WHERE FIND_IN_SET(2, 
   REPLACE(REPLACE(col, '+', ','), '|', ',')) )

使用 REGEXP_REPLACE(),可以写得更简单:

WHERE FIND_IN_SET(2, 
   REGEXP_REPLACE(col, '[+|]', ',') )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多