使用 AutoWikiBrowser 的 wiki 文章中的句子大小写

Sentence case in wiki articles using AutoWikiBrowser

我正在尝试使用 AutoWikiBrowser (AWB)(处理正则表达式查找和替换的自动编辑器,但并非所有功能都可用)将 wiki 文章的文本放在句子中。

问题是 wikicode 使用许多不同的标签来格式化文本,还有模板(在双花括号内)、图像(在 [[File:image.png|Caption]] 内)和类别(在 [[Category:Category name]] 内)应该保持原状。首字母缩略词也应该保持大写。

章节标题(两到五个等号内)应按句子大小写,链接中的单词(双方括号内)应视为普通文本。

我遇到了麻烦,因为我不熟悉 positive/negative lookahead/lookbehind,而且我找不到一种方法来简化正则表达式,而不必编写所有可能的语法。

此外,如果 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

但它似乎过于复杂并且无法正常工作。

抱歉,如果这看起来很复杂,但我现在已经尝试了两天,而且我似乎 运行 在圈子里......

[编辑]

问题已经得到解答,但我想补充一个请求:这个正则表达式只能在多行注释(在 <!-- / --> 标签内)和 [=59 之外工作吗? =]s(在 {| / |} 标签内)?

如果句子大小写可以放入 table 单元格中(由竖线和感叹号分隔),那就更好了,其中可能包含链接 and/or italic/bold?

这是它的样子:

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]]
|}

由于 AWB 中使用的正则表达式风格原来是 .NET,您可以使用具有可变宽度后视模式的正则表达式:

(?m)(?!^)(?<!\.\s+|\[\[(?:Category|File):[^\]\[]*)(?<!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|<!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)\b([A-Z][a-z]*)\b(?![^{}]*}}|[\w\s]*-->)(?<!\[\[(?:Category|File)(?=:[^\]\[]*]]))

参见regex demo详情:

  • (?m) - 开启多行模式
  • (?!^) - 不在行首
  • (?<!\.\s+|\[\[(?:Category|File):[^\]\[]*) - 紧接其前,不应有 . 和一个或多个空格,或者 [[ 后跟 CategoryFile 然后: 然后 []
  • 以外的零个或多个字符
  • (?<!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|<!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?) - 如果在紧接之前有类似的模式,则匹配失败的负面回顾
    • \{\|| - {| 字符串,或
    • \{\{| - {{ 字符串,或
    • ^(?:(?:\*\s*)?'?''|\*\s*)?\[\[| - 可选序列 * 和零 ro 更多空格后跟可选 ' 字符,然后是 ''* 字符后跟零个或多个空格,然后是 [[,或
    • <!--|^=+\s*|
    • ^#(?::|\*+)?\s*|
    • ^\*\s*(?:''')?
  • \b - 单词边界
  • ([A-Z][a-z]*) - 一个大写字母后跟零个或多个小写字母(在 .NET 中,您还可以使用 \p{Lu}\p{Ll}* 来匹配任何 Unicode 字母)
  • \b - 单词边界
  • (?![^{}]*}}|[\w\s]*-->) - 否定前瞻:如果除 {} 之外还有零个或多个字符,然后是 }} 或任何零个或多个字符,则不允许匹配word/whitespace 个字符,然后 -->
  • (?<!\[\[(?:Category|File)(?=:[^\]\[]*]])) - 如果紧接在 [[CategoryFile 之前并且紧接其后有零个或多个字符,则匹配失败[] 然后 ]].