如何在正则表达式中指定随机组位置而不是序列?

时间:2014-04-16 02:47:09

标签: java regex grouping markup wikitext

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

单词定义转储,这是我的主要兴趣,是原始的wiki-markup,它不是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元素时的常见问题。我非常感谢有关如何编写正则表达式来处理这种位置复杂性的任何建议。非常感谢! - 杰夫。

1 个答案:

答案 0 :(得分:0)

根据RegexBuddy的Java风格,你的正则表达式匹配每一行,虽然我不明白它是否正在捕获你想要的。

然而,这是非常缓慢的,因为debuggex现在已经开始大约十分钟了,仍然没有回应。尽管有一小部分输入,但这仍然存在。

...最后:

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

Regular expression visualization

Debuggex Demo

它实际上不适用于Debuggex。出于某种原因,尽管我添加了m标记以及^$,但它并未锚定到行的开头和结尾。他们在RegexBuddy中工作正常。

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

除了阻止你使用正则表达式之外,我还让你知道Stack Overflow Regular Expressions FAQ:)