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



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

/^(?:hows+dos+Is+yous+gets+fars+iss+its+froms+)?(.+)s+tos+(.+)/i

这应该捕获"to"之前和之后的单词,前面有可选单词,可以形成这样的问题:我如何从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

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

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

(a|b|c)

我认为你想做的是这样的:

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

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

如果要保留词序,可以使用正则表达式,例如以下伪代码:

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

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

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

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

看看演示。

最新更新