求正则表达式:用AutoHotKey格式化维基百科信息框Wikicode
解决AutoHotKey格式化维基百科信息框Wikicode的方案
核心思路
要实现规范格式,需分两步处理:
- 第一步:统一所有参数行的开头格式,同时规范等号前后的空格
- 第二步:计算最长参数名的长度,为每个参数名补充空格使等号对齐
步骤1:统一行首与等号格式
在AutoHotKey中使用正则替换,将不规范的参数行转换为标准开头:
; 处理单行参数,统一格式 FormattedText := RegExReplace(InputText, "m`a)^|(\w[\w\s.]+?)\s*=\s*(.*)$", " | $1 = $2")
ma)`:启用多行模式和自动换行支持^|:匹配行首的竖线(\w[\w\s.]+?):捕获参数名(支持字母、数字、空格、点号)\s*=\s*:匹配等号前后的任意数量空格(.*)$:捕获参数值直到行尾
步骤2:自动对齐等号
完成第一步后,需要通过代码计算最长参数名长度,实现等号对齐:
FormatInfobox(InputText) { ; 第一步:统一基础格式 TempText := RegExReplace(InputText, "m`a)^|(\w[\w\s.]+?)\s*=\s*(.*)$", " | $1 = $2") ; 遍历所有行,找出最长的参数名长度 MaxParamLength := 0 Loop, Parse, TempText, `n, `r { if RegExMatch(A_LoopField, "^\s*\|\s*([\w\s.]+?)\s*=", , 1) { CleanedName := Trim($1) CurrentLength := StrLen(CleanedName) if CurrentLength > MaxParamLength MaxParamLength := CurrentLength } } ; 逐行格式化,对齐等号 FinalText := "" Loop, Parse, TempText, `n, `r { if RegExMatch(A_LoopField, "^\s*\|\s*([\w\s.]+?)\s*=(.*)$", Match) { ParamName := Trim(Match1) ParamValue := Match2 ; 计算需要补充的空格数 SpaceCount := MaxParamLength - StrLen(ParamName) ; 拼接对齐后的行 FormattedLine := " | " ParamName . StrRepeat(" ", SpaceCount) . " = " ParamValue } else { ; 保留非参数行(如模板开头、结尾) FormattedLine := A_LoopField } FinalText .= FormattedLine "`n" } return RTrim(FinalText, "`n") } ; 辅助函数:生成重复的空格字符串 StrRepeat(Char, RepeatCount) { return StrReplace(StrRepeat("x", RepeatCount), "x", Char) }
使用示例
将不规范的信息框代码传入函数:
{{Infobox XYZ |first parameter=foo |second_parameter= |3rd parameter=bar |4th=bazzzzz |5th= |etc.= }}
处理后得到规范格式:
{{Infobox XYZ | first parameter = foo | second_parameter = | 3rd parameter = bar | 4th = bazzzzz | 5th = | etc. = }}
内容的提问来源于stack exchange,提问作者oli_vi_er
相关产品推荐
相关产品推荐

