提问人:oli_vi_er 提问时间:11/15/2022 最后编辑:vvvvvoli_vi_er 更新时间:2/25/2023 访问量:45
正则表达式格式化维基百科的信息框代码
RegEx to format Wikipedia's infoboxes code
问:
我是维基百科的贡献者,我想用AutoHotKey制作一个脚本,可以格式化信息框和其他类似模板的wikicode。
信息框是在文章侧面显示一个框并显示输入参数值的模板(它们很多,并且根据信息框的不同,它们在数量、长度和字符类型上有所不同)。
参数始终以竖线 () 开头,并以等号 () 结尾。在极少数情况下,可以将多个参数放在同一行上,但我可以在运行脚本之前手动对其进行排序。|
=
典型的信息框是这样的:
{{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.=
}}
这并不容易阅读和修改。
我想知道是否有可能制作一个正则表达式(或一系列正则表达式)将第二个示例转换为第一个示例。
这些行应以空格开头,然后是竖线,然后是另一个空格,然后是参数名称,然后是任意数量的空格(以匹配其他行的长度),然后是等号,然后是另一个空格,如果存在,则为参数值。
我尝试使用多个捕获组进行一些操作,但我无处可去......(我什至羞于展示我的尝试,因为它们真的不起作用)。
有人会知道如何让它工作吗?
感谢您抽出宝贵时间接受采访。
答:
这些行应以空格开头,然后是竖线,然后是另一个空格,然后是参数名称,然后是空格,然后是等号,然后是另一个空格,如果存在,则为参数值。
首先是选择,它相对微不足道:
^\s*\|\s*([^=]*?)\s*=(.*)$
然后是替换,从字面上看,你对你想要什么的描述(注意开头的空格):
| $1 = $2
评论
@Blindy:
到目前为止,我发现的最好的代码如下: https://regex101.com/r/GunrUg/1
问题是它没有垂直对齐等号......
我在AutoHotKey论坛上得到了答案:
^i::
out := ""
Send, ^x
regex := "O)\s*\|\s*(.*?)\s*=\s*(.*)", width := 1
Loop, Parse, Clipboard, `n, `r
If RegExMatch(A_LoopField, regex, _)
width := Max(width, StrLen(_[1]))
Loop, Parse, Clipboard, `n, `r
If RegExMatch(A_LoopField, regex, _)
out .= Format(" | {:-" width "} = {2}", _[1],_[2]) "`n"
else
out .= A_LoopField "`n"
Clipboard := out
Send, ^v
Return
使用此脚本,按 Ctrl+i 可以正确格式化信息框代码(我想一个简单的正则表达式不足以完成这项工作)。
评论