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

Sentence case in wiki articles using AutoWikiBrowser

提问人:oli_vi_er 提问时间:9/10/2021 最后编辑:oli_vi_er 更新时间:9/10/2021 访问量:92

问:

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

问题在于wikicode使用许多不同的标签来格式化文本,并且还有模板(在双卷曲制动器内),图像(内部)和类别(内部)应该保持不变。首字母缩略词也应保留在大写字母中。[[File:image.png|Caption]][[Category:Category name]]

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

我遇到了麻烦,因为我不熟悉正/负前瞻/后视,而且我找不到一种方法来使正则表达式变得简单,而不必编写所有可能的语法。

此外,如果 AWB 可以连续执行多个正则表达式,那么这里并不真正可行,因为例如,我无法制作正则表达式来匹配正文中的单词而不是模板中的单词(或者我没有找到这样做的方法)。

请注意,大小写修饰符在 AWB 中不起作用,但可以替换为 ,所以不要介意它并在您的示例中使用,我会自己调整代码。有些令牌也不起作用,不幸的是我不知道正则表达式库 AWB 正在使用什么。\L{{subst:lg:}}\L\h

这是我想编辑的文章示例,我只想匹配: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]]

例如,我尝试使用这个正则表达式: 查找: 替换: \L$1(?<!\n|\. |\[\[Category:|\[\[File:)(?<!\{\||\{\{|^\[\[|<!--|^== |^=== |^==== |^===== |^''|^''')(\b[A-Z][a-z]*\b)(?![\w\s]*[\}|}]|[\w\s]*-->)

但它似乎过于复杂,而且它也没有像我想要的那样工作。

对不起,如果这看起来很复杂,但我现在已经尝试了两天,我似乎在兜圈子......

[编辑]

这个问题已经得到了很好的回答,但我想添加一个请求:这个正则表达式可以只在多行注释(内部/标签)和表格(内部/标签)之外工作吗?<!---->{||}

如果可以将句子大小写放入表格单元格(由管道和感叹号分隔)中,其中可能包括链接和/或斜体/粗体,那就更好了?

下面是它的样子:

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]]
|}
表达式正则表达式环视

评论

0赞 Wiktor Stribiżew 9/10/2021
检查此正则表达式 .不过,它使用的是可变宽度的后视。(?!^)(?<!\. |\[\[(?:Category|File):[^\]\[]*)(?<!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|<!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)\b([A-Z][a-z]*)\b(?![^{}]*}}|[\w\s]*-->)(?<!\[\[(?:Category|File)(?=:[^\]\[]*]]))
0赞 oli_vi_er 9/10/2021
谢谢@Wiktor,它似乎在我的示例文本上运行良好,我将在 wiki 上进行测试。它教我在前瞻/后方组中使用非捕获组 (),这是我正在寻找的一种方法,但无法在文档中找到它。我什至认为我现在能够根据我的需求调整您的正则表达式。(?:)
0赞 oli_vi_er 9/10/2021
@Wiktor Stribiżew : 顺便问一下,你在哪里发现 AWB 正在使用 ECMAScript ?在使用 regex101.com 制作正则表达式时,这对我有很大帮助,这对我来说一直是一个问题。
0赞 Wiktor Stribiżew 9/10/2021
我不知道它是否使用 ECMAScript。您提到的不支持,但可以环顾。它可以是 Python、JS 或 .NET,后两者支持可变宽度的后视。你认为我应该发布正则表达式作为答案吗?它是否正常工作?\h
0赞 oli_vi_er 9/10/2021
经过一番研究,我认为它是用.NET en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/Technical 编写的。维基百科上的文档有点混乱,因为提到了有关 Perl 和 Python 的文档外部站点。不幸的是,我不够精通技术,无法更好地了解这一点......

答:

1赞 Wiktor Stribiżew 9/10/2021 #1

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

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

请参阅正则表达式演示细节

  • (?m)- 多线模式开启
  • (?!^)- 不在行的开头
  • (?<!\.\s+|\[\[(?:Category|File):[^\]\[]*)- 紧接着,应该没有 和 一个或多个空格,或者后面跟着 or 和 然后,然后是零个或多个字符,除了 和.[[CategoryFile:[]
  • (?<!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|<!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)- 负后视,如果之前有类似
    • \{\|| - {|string,或者
    • \{\{| - {{string,或者
    • ^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|- 可选序列的可选序列 和 零 ro 更多空格,后跟可选的 char 和 then 或 char 后跟零个或多个空格,然后 ,或*'''*[[
    • <!--|^=+\s*|
    • ^#(?::|\*+)?\s*|
    • ^\*\s*(?:''')?
  • \b- 词边界
  • ([A-Z][a-z]*)- 一个大写字母,后跟零个或多个小写字母(在 .NET 中,您还可以用于匹配任何 Unicode 字母)\p{Lu}\p{Ll}*
  • \b- 词边界
  • (?![^{}]*}}|[\w\s]*-->)- 否定展望:如果除 and and then 之外有零个或多个字符,或者任何零个或多个单词/空格字符 and then ,则不允许匹配{}}}-->
  • (?<!\[\[(?:Category|File)(?=:[^\]\[]*]]))- 如果紧接着有 ,或 和 之后,除了 和 和 之外有零个或多个字符,则匹配失败。[[CategoryFile[]]]

评论

0赞 oli_vi_er 9/10/2021
你能看看第一篇文章吗,我想添加一个请求,以排除评论和表格中的匹配项,因为我找不到这样做的方法。
1赞 Wiktor Stribiżew 9/10/2021
@oli_vi_er 查看(?!^)(?<!\.\s+| \|\| (?:''|\[\[)?|(?m:^\| (?:'')?|^\|\+\s*)|! '''(?:\[\[)?| ''\[\[|\[\[(?:Category|File):[^\]\[]*)(?<!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|<!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)\b([A-Z][a-z]*)\b(?![^{}]*}}|[\w\s]*-->)(?<!\[\[(?:Category|File)(?=:[^\]\[]*]]))
0赞 oli_vi_er 9/10/2021
谢谢!我猜 m 是 (?m:^\|(?:'')?|^\|\+\s*),没有它,它似乎可以按预期工作。我真的希望我能有你制作正则表达式的能力,这通常需要我几个小时的反复试验,以确保做出有用的东西......
0赞 oli_vi_er 9/10/2021
实际上,对于 AWB 来说,这似乎不是问题(它是带有 ECMAScript 库的 regex101 的问题)。m
0赞 Wiktor Stribiżew 9/10/2021
那么请不要使用 regex101,它与 .NET 正则表达式不兼容。