我正在尝试使用可用的维基词典数据转储下载,我一直在用 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 元素时的常见问题。我非常感谢有关如何编写正则表达式来处理这种位置复杂性的任何建议。非常感谢!- 杰夫。