1

我正在尝试使用可用的维基词典数据转储下载,我一直在用 Java 及其正则表达式类(特别是 Pattern 和 Matcher)进行翻译,并取得了相当大的成功。

我主要感兴趣的词定义转储是原始 wiki 标记,它不是 html 也不是 xml 等,而是它自己独特的格式。有许多不同的元素,但最难处理的是模板。

我遇到的是具有位置字段的特定模板,以及可以以任何顺序出现的可选模板。我已经能够提出正则表达式,它几乎可以完成这项工作,但不足以处理我遇到的每个实例,其中字段被切换或可选地省略。

我从中意识到,当出现的顺序比序列更复杂时,我不知道如何指定正则表达式组的位置。

这些复杂模板之一的示例是“术语”模板,记录在以下页面上:http ://en.wiktionary.org/wiki/Template:term

我对正则表达式的最佳尝试(目前省略了使字符串 Java 兼容所需的额外转义字符)如下:

\{\{term\|(.+?)(?:\|(.*?))?(?:\|([\w, -]+?))?(?:\|lang=([\w-]+?))?(?:\|sc=(\w+?))?(?:\|tr=([\w, -]+?))?(?:\|pos=(\w+?))?(?:\|lit=([\w, -]+))?\}\}

这适用于遇到的术语模板的真实示例,例如:

{{term|λόγος|logos|word|lang=grc}}
{{term|verbum|verbō|for the word|lang=la}}
{{term|*bʰer-||to carry|lang=ine-pro}}
{{term|alternative lifestyle|lang=en}}
{{term|שוין||already|lang=yi|tr=shoyn}}
{{term|Bögge||goblin, snot|lang=nds}}
{{term|as}}

但它无法在以下情况下正常工作:

{{term|deus ex māchinā||device|pos=n|lit=god from a device|lang=la}}
{{term|ри̏ба||fish|tr=rȉba|sc=Cyrl|lang=sh}}
{{term|שוין|lang=yi|tr=shoyn}}
{{term|lang=en|vocational}}

必须有一种方法来指定某些组是位置的,而某些组可以随机出现,而不仅仅是可选地以特定顺序出现。例如,这应该是处理许多 HTML 元素时的常见问题。我非常感谢有关如何编写正则表达式来处理这种位置复杂性的任何建议。非常感谢!- 杰夫。

4

1 回答 1

0

根据Java 风格的RegexBuddy,您的正则表达式匹配每一行,尽管我不明白它是否准确地捕获了您想要的内容。

然而,它非常慢,因为 debuggex 已经在它上面运行了大约十分钟,仍然没有任何响应。尽管输入很少。

...最后:

^\{\{term\|(.+?)(?:\|(.*?))?(?:\|([\w, -]+?))?(?:\|lang=([\w-]+?))?(?:\|sc=(\w+?))?(?:\|tr=([\w, -]+?))?(?:\|pos=(\w+?))?(?:\|lit=([\w, -]+))?\}\}$

正则表达式可视化

调试演示

它实际上不适用于 Debuggex。出于某种原因,它没有锚定到行的开始和结束,尽管我添加了m标志和^and 。$他们在 RegexBuddy 中工作正常。

我认为这对正则表达式来说不是一个好问题。不是一个合理的单一正则表达式。拆分每一行|是处理这个问题的更好方法

除了劝阻您不要使用正则表达式之外,我还让您了解Stack Overflow 正则表达式常见问题解答 :)

于 2014-04-16T03:36:24.343 回答