我将一些站点迁移到不同的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
答案 0 :(得分:1)
您可以在s:(\d+):\\\"
和模式的其余部分之间匹配任何文本,但转义双引号除外:
s:(\d+):\\\"[^\\]*(?:\\(?!\")[^\\]*)*?(https?:\/\/)?example\.com
请参见regex demo。
添加的模式为[^\\]*(?:\\(?!\")[^\\]*)*?
:
[^\\]*
-除\
以外的任何0+个字符(?:\\(?!\")[^\\]*)*?
-至少0次出现,顺序如下:
\\
-反斜杠(?!\")
-不带双引号[^\\]*
-除\
以外的任何0+个字符