如何用单条正则替换|arquivourl=与|arquivodata=为|wayb=?
单条正则实现双向参数顺序的替换需求
可以用单条正则解决这个问题,核心是修正原正则中可能导致目标参数被意外包含在捕获组的问题,确保无论arquivodata/archive-date在arquivourl/archive-url的前后,都能被精准匹配并移除,同时保留其他参数并生成|wayb=。
改进后的正则表达式
查找模式:
(\{\{(?:cite|citar?)(?:(?!\| ?(?:arquivodata|dataarquivo|archive-?date|arquivourl|urlarquivo|archive-?url) ?=).)*)(?:\| ?(?:arquivodata|dataarquivo|archive-?date) ?=.*?(?=\||\}))?(.*?)(?:\| ?(?:arquivourl|urlarquivo|archive-?url) ?= ?https?://web\.archive\.org/web/(\d+)/.*?(?=\||\}))?(.*?)(?:\| ?(?:arquivodata|dataarquivo|archive-?date) ?=.*?(?=\||\}))?(.*?)\}\}
替换模式:
$1$2|wayb=$3$4$5}}
关键改进点
- 限制捕获组$1的匹配范围:把原正则中$1里的
.*?替换为(?:(?!\| ?(?:arquivodata|dataarquivo|archive-?date|arquivourl|urlarquivo|archive-?url) ?=).)*——这是一个负向预查的原子匹配,确保$1只捕获到第一个目标参数(date或url)之前的所有内容,避免引擎将date参数错误包含在$1中导致无法移除。 - 保留双向可选匹配:通过前后两个可选非捕获组匹配date参数,无论它出现在url的前面还是后面,都会被正则匹配并排除在最终输出之外。
- 精准捕获Wayback日期:依然通过
(\d+)捕获web.archive.org URL中的日期戳,用于生成|wayb=参数值。
验证示例
示例1:date参数在url参数之后
原始内容:
{{cite news|title=测试标题|arquivourl=https://web.archive.org/web/20240101/https://example.com|arquivodata=2024-01-01}}
替换后结果:
{{cite news|title=测试标题|wayb=20240101}}
示例2:date参数在url参数之前
原始内容:
{{cite news|title=测试标题|arquivodata=2024-01-01|arquivourl=https://web.archive.org/web/20240101/https://example.com}}
替换后结果:
{{cite news|title=测试标题|wayb=20240101}}
示例3:仅存在url参数
原始内容:
{{cite news|title=测试标题|arquivourl=https://web.archive.org/web/20240101/https://example.com}}
替换后结果:
{{cite news|title=测试标题|wayb=20240101}}
内容的提问来源于stack exchange,提问作者Vickvvy
相关产品推荐
相关产品推荐

