【发布时间】:2021-09-09 22:45:07
【问题描述】:
我正在尝试使用 AutoWikiBrowser (AWB)(处理正则表达式查找和替换的自动编辑器,但并非所有功能都可用)将 wiki 文章的文本放在句子中。
问题在于 wikicode 使用许多不同的标签来格式化文本,还有模板(在双花括号内)、图像(在 [[File:image.png|Caption]] 内)和类别(在 [[Category:Category name]] 内)应该保持不变。首字母缩略词也应该大写。
章节标题(两到五个等号内)应放在句子大小写中,链接中的单词(双方括号内)应视为普通文本。
我遇到了麻烦,因为我不熟悉正/负前瞻/后视,而且我无法找到一种方法来简化正则表达式,而无需编写所有可能的语法。
另外,如果 AWB 可以连续执行多个正则表达式,那么这里实际上并不可行,因为例如我无法制作正则表达式来匹配正文中的单词而不是模板内的单词(或者我没有没有办法这样做)。
注意大小写修饰符\L在AWB中不起作用,但可以用{{subst:lg:}}代替,所以不要介意,在你的例子中使用\L,我会修改代码我。像\h 这样的一些标记也不起作用,不幸的是我不知道 AWB 正在使用什么正则表达式库。
这是我要编辑的文章示例,我只想匹配Yes:
No Yes no Yes. No, Yes.
== No Yes no ==
==== No Yes ====
[[No Yes]] Yes Yes no no no.
No no [[NO Yes]].
'''[[No Yes]]'''
''[[No Yes]]'' no Yes ''[[Yes Yes]]'' no ''Yes no''.
{{No:No|No No}}
* No Yes.
* '''No Yes'''.
* [[No Yes]].
* '''[[No Yes]]'''.
# No Yes.
#** No Yes.
#: No Yes.
No no no [[File:No.png|No No]] Yes [[Yes Yes]].
[[Category:No No]]
例如,我尝试使用这个正则表达式:
查找:(?<!\n|\. |\[\[Category:|\[\[File:)(?<!\{\||\{\{|^\[\[|<!--|^== |^=== |^==== |^===== |^''|^''')(\b[A-Z][a-z]*\b)(?![\w\s]*[\}|}]|[\w\s]*-->)
替换:\L$1
但它似乎过于复杂,而且它也没有像我想要的那样工作。
对不起,如果这看起来很复杂,但我现在正在尝试两天,我似乎在兜圈子......
[编辑]
问题已经得到解答,但我想添加一个请求:此正则表达式能否仅在多行 cmets(<!--/--> 标签内)和表格({|/@987654336 内@标签)?
如果可以将句子大小写放入表格单元格中(由竖线和感叹号分隔)会更好,其中可能包括链接和/或斜体/粗体?
这是它的样子:
No Yes
<!-- No No No
No No
No
-->
{| class="wikitable"
|+ No Yes
|-
! '''No Yes''' !! '''No''' !! '''[[No Yes]]'''
|-
| ''No Yes'' || ''[[No Yes Yes]]'' || ''No Yes''
|-
| No Yes || No Yes || [[No Yes Yes]]
|}
【问题讨论】:
-
检查this regex,
(?!^)(?<!\. |\[\[(?:Category|File):[^\]\[]*)(?<!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|<!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)\b([A-Z][a-z]*)\b(?![^{}]*}}|[\w\s]*-->)(?<!\[\[(?:Category|File)(?=:[^\]\[]*]]))。虽然它使用可变宽度的lookbehind。 -
感谢@Wiktor,它似乎在我的示例文本上运行良好,我将在 wiki 上进行测试。它教我在前瞻/后向组中使用非捕获组 (
(?:)),这是我一直在寻找的一种方法,但无法在文档中找到它。我什至认为我现在可以根据我的需要调整你的正则表达式。 -
@Wiktor Stribiżew:顺便问一下,您在哪里发现 AWB 正在使用 ECMAScript?在使用 regex101.com 制作正则表达式时,这对我有很大帮助,这对我来说一直是个问题。
-
我不知道它是否使用ECMAScript。您提到不支持
\h,但可以使用环视。它可能是 Python、JS 或 .NET,后两者支持可变宽度后视。你认为我应该发布正则表达式作为答案吗?它是否正常工作? -
经过一番研究,我认为它是用 .NET en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/Technical 编写的。维基百科上的文档有点混乱,因为提到了有关 Perl 和 Python 的文档外部站点。不幸的是,我没有足够的技术知识来更好地了解这一点......