.NET正则捕获异常:AutoWikiBrowser语言模板合并故障排查
解决AWB中合并语言标识模板的.NET正则问题
问题说明
需要将最多14个形如{{ab}}(内含2-3个字母)的语言标识模板,合并为单个{{mul|ab|cd|...}}模板。现有正则在模板以空格分隔时正常工作,但无空格连续排列时无法正确捕获末尾模板,且枚举语言代码的写法不通用。
改进后的正则方案
1. 合并模板的查找正则(.NET兼容,AWB可用)
此正则匹配1-14个连续的语言模板,支持模板间有0个或多个空格分隔,自动匹配2-3字母的语言标识:
\{\{ *([a-zA-Z]{2,3}) *\}\}(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?(?: *\{\{ *([a-zA-Z]{2,3}) *\}\})?
2. 替换模式
将匹配到的语言标识拼接为mul模板:
{{mul|$1|$2|$3|$4|$5|$6|$7|$8|$9|$10|$11|$12|$13|$14}}
3. 清理多余管道符的正则
替换后会出现未匹配捕获组导致的空管道符(如{{mul|ab|cd||}}),按以下步骤清理:
- 第一步:移除末尾空管道符
- 查找:
\{\{mul\|(.*?)\|\}\} - 替换:
{{mul|$1}}
- 查找:
- 第二步:合并连续管道符
- 查找:
\|\|+ - 替换:
|
- 查找:
重复运行清理正则,直到无匹配项为止。
关键改进点
- 用
[a-zA-Z]{2,3}替代枚举的语言代码,适配所有合法的语言标识 - 每个模板间的分隔符用
*(匹配0或多空格),支持有无空格的连续模板 - 用14个可选的捕获组覆盖最多14个模板的场景,确保每个标识都能被正确捕获
内容的提问来源于stack exchange,提问作者oli_vi_er
相关产品推荐
相关产品推荐

