从 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:
sfo
和 lax
.
而是 returns:
how far is it from sfo
和 lax
你的问题是你的正则表达式的第一块没有意义。
要从多个选项中进行选择,请使用以下语法:
(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。
我正在尝试修复用于 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:
sfo
和 lax
.
而是 returns:
how far is it from sfo
和 lax
你的问题是你的正则表达式的第一块没有意义。
要从多个选项中进行选择,请使用以下语法:
(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。