【问题标题】:Sentence case in wiki articles using AutoWikiBrowser使用 AutoWikiBrowser 的 wiki 文章中的句子大小写
【发布时间】: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(?!^)(?&lt;!\. |\[\[(?:Category|File):[^\]\[]*)(?&lt;!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|&lt;!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)\b([A-Z][a-z]*)\b(?![^{}]*}}|[\w\s]*--&gt;)(?&lt;!\[\[(?: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 的文档外部站点。不幸的是,我没有足够的技术知识来更好地了解这一点......

标签: regex regex-lookarounds


【解决方案1】:

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

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

请参阅regex demo详情

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

【讨论】:

  • 你能看看第一篇文章吗,我想添加一个排除 cmets 和表中匹配项的请求,因为我找不到这样做的方法。
  • @oli_vi_er 见(?!^)(?&lt;!\.\s+| \|\| (?:''|\[\[)?|(?m:^\| (?:'')?|^\|\+\s*)|! '''(?:\[\[)?| ''\[\[|\[\[(?:Category|File):[^\]\[]*)(?&lt;!\{\||\{\{|^(?:(?:\*\s*)?'?''|\*\s*)?\[\[|&lt;!--|^=+\s*|^#(?::|\*+)?\s*|^\*\s*(?:''')?)\b([A-Z][a-z]*)\b(?![^{}]*}}|[\w\s]*--&gt;)(?&lt;!\[\[(?:Category|File)(?=:[^\]\[]*]]))
  • 谢谢!我猜 m 是 (?m:^\| (?:'')?|^\|\+\s*) 中的错字,没有它似乎可以按预期工作。我真的希望我能拥有你制作正则表达式的能力,这通常需要我数小时的反复试验,但不能确保使某些东西可用......
  • 实际上,m 对于 AWB 来说似乎不是问题(它是带有 ECMAScript 库的 regex101 的问题)。
  • 那么请不要使用regex101,它不兼容.NET regex。
猜你喜欢
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2010-09-17
  • 2011-10-29
  • 2012-11-01
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多