MediaWiki链接转换正则跨链接重叠匹配问题修复求助
MediaWiki Wiki链接格式替换正则修复方案
故障原因
原正则/\[\[(.*?) \((.*?)\)\|(.*?)]]/gm出现跨链接匹配错误的核心逻辑缺陷:
- 模式中
.*?非贪婪匹配默认匹配除换行外的任意字符,包含Wiki链接边界标记[[、]] - 非贪婪匹配仅保证匹配满足规则的最短字符串,但从第一个
[[起始位置向后检索时,第一个符合「 (xxx)|xxx]]」结构的位置如果跨过相邻链接,正则会直接将中间的]] [[等内容吞入捕获组,造成跨链接的错误匹配。
修复后可用正则
/\[\[([^\[\]]+) \(([^\[\]]+)\)\|([^\[\]]+)]]/gm
修复说明
- 将三个捕获组的匹配规则从
.*?替换为[^\[\]]+,强制捕获组仅匹配不包含方括号的内容,从规则层面限制单个匹配项无法超出[[、]]包裹的单条Wiki链接边界,彻底避免相邻链接被错误合并。 - 若业务场景中链接名、标识符内部允许出现方括号,可将捕获组替换为
(?:(?!\[\[|]]).)+(通过负前瞻过滤链接边界标记);通用MediaWiki场景下[^\[\]]+性能更好,完全满足使用需求。
替换串
搭配以下替换串即可输出目标模板格式:
{{<template>|$1|$2}}
效果验证
使用提供的测试样例实测:
输入原文:
====[[<link #1>]] [[<link #2 name> (<link #2 identifier>)|<link #2 name>]]==== [[<link #3 name> (<link #3 identifier>)|<link #3 name>]]
替换后输出:
====[[<link #1>]] {{<template>|<link #2 name>|<link #2 identifier>}}==== {{<template>|<link #3 name>|<link #3 identifier>}}
不符合目标格式的第一个链接被完整保留,两个符合规则的链接被正确转换为模板调用,无跨匹配错误。
内容的提问来源于stack exchange,提问作者PanchamBro
相关产品推荐
相关产品推荐

