【问题标题】:mysql regex - filter for a number greater than XX when followed by a specific stringmysql regex - 过滤大于 XX 后跟特定字符串的数字
【发布时间】:2020-05-14 08:57:59
【问题描述】:

我正在寻找可以在 MySql 查询中使用的正则表达式

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

我可以在第二步中使用 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

【问题讨论】:

  • 如果要在 MySQL 中使用正则表达式,只能在 v.8+ 中使用 \b。你的 MySQL 版本是多少?
  • 耐火有效值的范围是多少?
  • @ Wiktor mysqld Ver 5.7.29-0ubuntu0.16.04.1 for Linux on x86_64 ((Ubuntu)) 应该是我使用的版本,但如果有必要可以更新。 @danblack 范围应该是 1-99%
  • 在旧的 MySQL 版本中尝试REGEXP '[[:<:]](2[2-9]|[3-9][0-9]|[1-9][0-9]{2,})([.][0-9]+)?% to Fire Resistance[[:>:]]'[[:<:]][[:>:]]\bs,非捕获组应该变成捕获组。
  • @WiktorStribiżew 先生,我的 5 小时痛苦,这正是我所需要的,它就像一个魅力,我什至有点理解它的作用:D 谢谢

标签: php mysql sql regex regular-language


【解决方案1】:

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

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

详情

  • [[:&lt;:]] - 左字边界
  • (2[2-9]|[3-9][0-9]|[1-9][0-9]{2,}) - 组匹配
    • 2[2-9] - 2 后跟一个从 29 的数字
    • | - 或
    • [3-9][0-9] - 从 39 的数字,然后是任意 1 数字
    • | - 或
    • [1-9][0-9]{2,} - 从19 的一个数字,然后是两个或多个数字
  • ([.][0-9]+)? - 可选的 . 和 1+ 位
  • % to Fire Resistance - 一个子字符串
  • [[:&gt;:]] - 右字边界

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 2020-01-08
    相关资源
    最近更新 更多