【问题标题】:RegEx: Delete all numbers followed by a commaRegEx:删除所有数字后跟逗号
【发布时间】:2018-01-04 10:29:21
【问题描述】:

我的数据库中有 HTML 链接需要修改。 示例链接如下所示:

<a href="http://example.com/category/subcategory/1,23,456.html">My Link </a>

想把它改成这样:

<a href="http://example.com/category/subcategory/456.html">My Link </a>

我已经尝试过:/(href=".*)\d+.*,/U,但最终只删除了链接中的1,。 我最大的问题是告诉表达式“查找任何出现的数字后跟逗号,但不是句点”。

谁能帮助我找到一个删除所有数字后跟逗号的正则表达式? 请记住,这些链接位于一个非常大的 HTML 代码块中。所以正则表达式必须只匹配这些链接。

【问题讨论】:

  • 感谢您的建议。我需要确保只有带逗号的数字在链接中匹配。当我将模式修改为 (href=".*)(\d+,) 时,它不会按需要工作:regex101.com/r/EZlCgO/4
  • 在 regex101 链接中您选择了 javascript,您使用的是什么语言?
  • 我刚刚使用了来自@Tushar 的那个。我实际上是在问题中标记的 MariaDB 中使用它。他们正在使用 PCRE
  • 好的,我会更新我的答案

标签: regex mariadb pcre


【解决方案1】:

遵循正则表达式

(?:(?:^|(?<!\\)").*?href=")(*SKIP)(?!)|\d+,
  • (*SKIP)(?!)
    • (?!): 失败
    • (*SKIP): 避免回溯
  • .*?href=":匹配第一个href="序列之前的所有内容
  • (?:^|(?&lt;!\\)") : ^ 行锚或 " 前面没有 \

请注意,如果 href 可以出现在标签之外,则可能不安全。

test with regex101

使用相同技术的更安全的解决方案

(?:<![CDATA[.*?]]>|<!--.*?-->|>[^<]*<|href="|"[^">]*(?=>)|(?<!href=)"(?:\\.|[^"])*")(*SKIP)(?!)|\d+,

【讨论】:

  • 非常感谢。它工作得几乎完美。我不得不将(?&lt;!\\) 更改为(?&lt;!\)。 MariaDB 在这种情况下似乎工作起来很奇怪,但在改变之后,它就奏效了。第二个修改是它不适用于\d+,而是使用[0-9]+。我不知道为什么 MariaDB 会这样,但它现在可以工作了。
猜你喜欢
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多