【问题标题】:PCRE Regex - replacing URLs in serialised stringsPCRE Regex - 替换序列化字符串中的 URL
【发布时间】:2019-03-07 20:11:39
【问题描述】:

我正在将一些站点迁移到不同的 URL,但我注意到数据库中有很多包含 URL 的序列化条目。我想出了一个相对简单的正则表达式来匹配以 URL 开头的字符串,但情况并非总是如此。这是我正在使用的正则表达式。

s:(\d+?):\\\"(https?:\/\/)?example\.com

这与以下内容完美匹配: s:15:\"http://example.com\" 但如果它之间有什么像:s:15:\"foo bar example.com\" (在这种情况下只是例子) 我尝试在此处添加.*? 之类的内容以匹配其间的字符,但随后正则表达式捕获了太多内容。

tl;dr 我如何停止正则表达式捕获太多。 这是我对虚拟样本使用的正则表达式。 https://regex101.com/r/3GRdLO/1

【问题讨论】:

标签: mysql regex serialization grep pcre


【解决方案1】:

您可以匹配除 s:(\d+):\\\" 和模式其余部分之间的转义双引号以外的任何文本:

s:(\d+):\\\"[^\\]*(?:\\(?!\")[^\\]*)*?(https?:\/\/)?example\.com

请参阅regex demo

添加的模式是[^\\]*(?:\\(?!\")[^\\]*)*?:

  • [^\\]* - 除\ 之外的任何 0+ 个字符
  • (?:\\(?!\")[^\\]*)*? - 0+ 次出现,尽可能少,以下序列:
    • \\ - 反斜杠
    • (?!\") - 后面没有双引号
    • [^\\]* - 除 \ 之外的任何 0+ 个字符

【讨论】:

  • 您好维克托,感谢您的帮助。认为我最终到达了那里(主要是由于您的帮助......)我在正则表达式的一块周围添加了一个量词,因此它还可以检查同一个序列化字符串中的多次出现。你可以在这里看到它:regex101.com/r/3GRdLO/9
  • @Rhys 我的模式提供了expected results
猜你喜欢
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多