2

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

/^(?: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应该返回:

sfolax

而是返回:

how far is it from sfolax

4

2 回答 2

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 …
于 2015-03-21T22:07:09.683 回答
1

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

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

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

看看演示

于 2015-03-21T22:09:12.570 回答