首页 > 解决方案 > mysql regex - 过滤大于 XX 后跟特定字符串的数字

问题描述

我正在寻找可以在 MySql 查询中使用的 RegEx

我要归档的是一个查询,它过滤所有行,其中有一个值为“xx% to Fire Resistance”的字符串,而 xx 是一个动态值,比如说 22,但我不只想要所有行 22,而是所有行具有 22 和更高的行。这有可能吗?

我可以在第二步中使用 php 对其进行过滤,但最初的结果将是大到实用的方式。

我目前拥有的(并且不能正常工作,因为它只是过滤给定字符串之前的数字)

SELECT * FROM items WHERE `mods` REGEXP '\b(\d+(?:\.\d+)?)% to Fire Resistance\b'

我理论上需要什么

SELECT * FROM items WHERE `mods` REGEXP '\b(\d+(?:\.\d+)?)% to Fire Resistance\b' > 22

一个示例“mods”字段内容

Some more text;+170 to Accuracy Rating;+25% to Fire Resistance;+4 to Armour;+6 to Evasion Rating;+43 to maximum Life;+39% to Lightning Resistance;Some more text;Some more text;

https://regex101.com/r/ZhIMzc/2

标签: phpmysqlsqlregexregular-language

解决方案


在 MySQL 8 之前的版本中,您可以使用

REGEXP '[[:<:]](2[2-9]|[3-9][0-9]|[1-9][0-9]{2,})([.][0-9]+)?% to Fire Resistance[[:>:]]'

细节

  • [[:<:]]- 左字边界
  • (2[2-9]|[3-9][0-9]|[1-9][0-9]{2,})- 组匹配
    • 2[2-9]-2后跟一个数字 from 2to9
    • |- 或者
    • [3-9][0-9]- 从3到的数字9,然后是任何 1 位数字
    • |- 或者
    • [1-9][0-9]{2,}- 从1to一个数字9,然后是两个或多个数字
  • ([.][0-9]+)?- 一个可选的.和 1+ 位数字
  • % to Fire Resistance- 一个子串
  • [[:>:]]- 右手边的单词边界

推荐阅读