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

Regex capturing from a non capture group in ruby

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

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

这应该捕获 'to' 前后的词,前面有可选词,可以形成这样的问题:我如何从 x 到 y,从 x 到 y 有多远,有多远是从 x 到 y 吗?

预期输出:

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

在大多数情况下,我的可选词都按预期工作。但是当我拉出我的响应匹配时,我得到了导致包含第一个捕获组的词。

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

sfolax.

而是 returns:

how far is it from sfolax

你的问题是你的正则表达式的第一块没有意义。

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

(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 …

当你想匹配 个单词时 \w 是我使用的最自然的模式(例如,它用于字数统计工具。)

要捕获 "to" 前后的任意 1 个单词,可以使用 (\w+\sto\s+\w*) 正则表达式来完成。

要return他们作为2个不同的组,你可以使用(\w+)\s+to\s+(\w+)

看看demo