2010-02-10 41 views
3

我正在尝试构建一个替代数据条目,其中用户将表达某种类型的命令,我将对其进行解析。与其详细讨论我将在这项工作中使用的词汇的细节,以下是我试图通过对雷克斯哈里森的应用来完成的一个例子。如何从特定顺序的字符串中捕获一组组别

给下面的句子

西班牙的雨水落在西班牙平原

在平原上落下的雨

的降雪在伦敦

草甸

in pseudo正则表达式:

(the (?<weather>\w+)) (in (<?city>\w+)) (falls) (on the (?<topography>\w+)) 

总之我需要用正则表达式来收集天气,城市和地形。

如何表达可以按任意顺序在输入中出现的一组捕捉?

+0

如果城市是“旧金山”,该怎么办? – kennytm 2010-02-10 17:07:24

+0

@肯尼你说得对,圣弗朗西斯科(等等)将是一个问题,这是我的英文单词比喻失效的地方。 在我的情况下,这些标记值将是我熟悉的用户代码,我想我们可以使它成为令牌都是单个词的约束条件。 – 2010-02-11 02:43:50

回答

2
^(?:on the (?<area>\w+)() ?|the (?<weather>\w+)() ?|in (?<location>\w+)() ?|falls()){4}\1\2\3\4$ 

将按照任何顺序匹配包含每个要素的句子一次。这就是空的括号 - 每个人都必须参加比赛,所以最终\1\2\3\4可以匹配。

指定的反向引用将包含可变元素。

+1

+1:这很巧妙!但请注意:某些引擎(例如Python)会将已命名的捕获数与已编号的捕获数进行计数,因此在这种情况下可能需要使用'\ 2 \ 4 \ 6 \ 7'。 – 2010-02-10 20:23:16

+0

这很有趣。 RegexBuddy没有考虑到这个事实。在.NET中,上面的正则表达式应该可以工作。混合命名和未命名的捕获组可能通常是一个糟糕的主意;我在这里做了更好的说明。 – 2010-02-10 20:37:22

+0

玩这个更多。我希望我能够{1,4} \ 1 \ 2 \ 3 \ 4并捕获至少1个,最多4个令牌,但这似乎不起作用,它只有4个或没有。我如何匹配一个部分“句子”? – 2010-02-11 19:21:51

2

首先,这看起来像是一个自然语言解析器的问题。

但如果你真的想要一个正则表达式的解决方案,你必须单独挑出每个模式,无论是使用正则表达式3或通过管道交替他们,例如:

(the (?<weather>\w+))|(in (<?city>\w+))|(on the (?<topography>\w+)) 

运行上面的任何反对你的例句中,你会得到3场比赛,其中每场比赛将有三组中的一组。

相关问题