正则表达式格式化维基百科的信息框代码

RegEx to format Wikipedia's infoboxes code

提问人:oli_vi_er 提问时间:11/15/2022 最后编辑:vvvvvoli_vi_er 更新时间:2/25/2023 访问量:45

问:

我是维基百科的贡献者,我想用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.= 
}}

这并不容易阅读和修改。

我想知道是否有可能制作一个正则表达式(或一系列正则表达式)将第二个示例转换为第一个示例。

这些行应以空格开头,然后是竖线,然后是另一个空格,然后是参数名称,然后是任意数量的空格(以匹配其他行的长度),然后是等号,然后是另一个空格,如果存在,则为参数值。

我尝试使用多个捕获组进行一些操作,但我无处可去......(我什至羞于展示我的尝试,因为它们真的不起作用)。

有人会知道如何让它工作吗?

感谢您抽出宝贵时间接受采访。

正则表达式 维基百科 信息框 维基文本

评论

1赞 Taazar 11/15/2022
如果你正在寻找一个脚本来做到这一点,我会推荐这个 en.wikipedia.org/wiki/User:Taavi/Aligner.js 它不使用正则表达式,但它确实可以执行您要执行的操作。
0赞 oli_vi_er 11/17/2022
@Taazar谢谢你,但我正在使用 Vector 2010,我认为它不适用于它,或者可能是因为我在 wp.fr(我刚刚将它添加到我的公共.js中,清除了我的缓存,但不知道如何让它工作,我的“更多”菜单中什么都没有)

答:

0赞 Blindy 11/15/2022 #1

这些行应以空格开头,然后是竖线,然后是另一个空格,然后是参数名称,然后是空格,然后是等号,然后是另一个空格,如果存在,则为参数值。

首先是选择,它相对微不足道:

^\s*\|\s*([^=]*?)\s*=(.*)$

然后是替换,从字面上看,你对你想要什么的描述(注意开头的空格):

 | $1 = $2

在此处查看实际操作

评论

0赞 oli_vi_er 11/15/2022
是的,但我希望等号对齐,而不仅仅是在开头添加“空格/管道/空格”,在参数名称后添加“空格/等号/空格”。对不起,我不得不编辑我的问题以澄清我想要什么......
0赞 Blindy 11/15/2022
不,它会保留新行。再次单击该链接。
0赞 oli_vi_er 11/15/2022
对不起,我编辑了我的评论...
0赞 oli_vi_er 11/15/2022
我希望结果像第一个例子一样,所有等号垂直对齐。顺便说一句,“\s”是无用的,它始终是维基百科代码中使用的普通空格。
0赞 Blindy 11/15/2022
编写正确的正则表达式从来都不是无用的。而且你想要的对齐块不可能一步到位地用正则表达式输出,你需要分两步完成:首先选择所有结果以获得最大大小,然后在替换函数中,你需要使用lambda来计算基于最大大小插入的空格数。
0赞 oli_vi_er 11/15/2022 #2

@Blindy:

到目前为止,我发现的最好的代码如下: https://regex101.com/r/GunrUg/1

问题是它没有垂直对齐等号......

0赞 oli_vi_er 11/18/2022 #3

我在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 可以正确格式化信息框代码(我想一个简单的正则表达式不足以完成这项工作)。