从ruby中的非捕获组捕获正则表达式

时间:2015-03-21 21:43:22

标签: ruby regex lita

我正在尝试修复一些regex,我有一个用于lita的chatops机器人。我有以下正则表达式:

/^(?:how\s+do\s+I\s+you\s+get\s+far\s+is\s+it\s+from\s+)?(.+)\s+to\s+(.+)/i

这应该捕获'到'之前和之后的单词,前面的可选单词可以形成如下问题:如何从x到y,从x到y有多远,如何远离它是从x到y。

预期产出:

match 1 : "x"
match 2 : "y"

在大多数情况下,我的可选单词按预期工作。但是当我拉回我的回应时,我会得到包含第一个捕获组的字样。

所以,how far is it from sfo to lax应该返回:

sfolax

但是返回:

how far is it from sfolax

2 个答案:

答案 0 :(得分:3)

你的小故障是你的正则表达式的第一块没有意义。

要从多个选项中进行选择,请使用以下语法:

(a|b|c)

我认为你要做的是:

/^(?:(?:how|do|I|you|get|far|is|it|from)\s+)*(.+)\s+to\s+(.+)/i

正则表达式表示跳过多个选项中的所有单词,无论顺序如何。

如果要保留单词顺序,可以使用此伪代码等正则表达式:

… how (can|do|will) (I|you|we) (get|go|travel) from …

答案 1 :(得分:1)

如果您想匹配\w是我使用的最自然的模式(例如,它用于字数工具。)

使用(\w+\sto\s+\w*)正则表达式捕获“to”之前和之后的任何1个单词。

要将它们作为2个不同的组返回,您可以使用(\w+)\s+to\s+(\w+)

查看demo