【问题标题】:Regex to match exact number in string without lookahead or lookbehind正则表达式匹配字符串中的确切数字,无需前瞻或后瞻
【发布时间】:2021-06-03 06:48:01
【问题描述】:

假设我正在寻找带有换行符的字符串中的特定数字: 1\n2\n4\n5\n7\n8\n9\n12\n13

Lookahead 和lookbehind 与以下内容完美配合:

(?<![0-9])12(?![0-9])

Regex 101 demo

但是,我需要一个针对 MySQL REGEXP 的解决方法,因为它不支持带有lookarounds 的模式。

【问题讨论】:

  • 什么是 MySQL 版本?您确定 \n 不是字符串中的换行符吗?
  • 实际上 \n 是 Joomla RSForm 中复选框组中不同选择的结果! Pro 形式并导致 sql 字段值中的换行符。 MySQL 版本 5.7.31
  • 我的查询 (Joomla) 是 for($i=0;$isetQuery("SELECT (SELECT COUNT(*) FROM #__rsform_submission_values WHERE FormId = '".JRequest::getInt('formId')."' AND FieldName = 'plages' AND FieldValue REGEXP '".($i+1)."[[:>:]]')" ); .....
  • 但是 REGEXP 不能得到像 1\n12 这样的结果....寻找 2 将捕获 2 of 12
  • 对不起,我的意思是(^|[^0-9])12($|[^0-9])

标签: mysql regex mysql-5.7


【解决方案1】:

如果 (?&lt;![0-9])12(?![0-9]) 在在线正则表达式引擎中为您工作,则以下正则表达式必须在基于 POSIX 的 REGEXP 模式中为您工作:

(^|[^0-9])12($|[^0-9])

或者,您可以使用单词边界:

[[:<:]]12[[:>:]]

请参阅regex demo

详情

  • (^|[^0-9]) - 字符串开头或非数字字符
  • [[:&lt;:]] - 引导词边界
  • 12 - 一个具体的数值,这里是12
  • [[:&gt;:]] - 词尾边界
  • ($|[^0-9]) - 字符串结尾或非数字。

【讨论】:

    【解决方案2】:

    对于 MySQL 8.0,

    "\\b12\\b"
    

    "\\s12\\s"
    

    前者检查“单词边界”,可能会更好。后者检查空格,例如\n

    双反斜杠可能有点过头了,具体取决于客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多