0

我有一个简单的 Hubot 脚本,它正在寻找某些触发词,然后使用基于这些触发词的 URL 进行回复。

一个稍微做作的例子:

robot.hear /CAT/i, (msg) ->
    msg.send "This is a URL - www.example.com/browse/cats"
robot.hear /YELLOWBIRD/i, (msg) ->
    msg.send "This is a URL - www.example.com/browse/yellowbirds"
robot.hear /BIRD/i, (msg) ->
    msg.send "This is a URL - www.example.com/browse/birds"

问题是,其中一个触发词(BIRD)是另一个触发词(YELLOWBIRD)的子串。

在这种情况下,我只想触发更具体的正则表达式(YELLOWBIRD)。

然而,Hubot 目前正在触发这两个正则表达式 - 即它将发送:

This is a URL - www.example.com/browse/yellowbirds
This is a URL - www.example.com/browse/birds

有没有办法让 Hubot 将正则表达式列表视为一个案例 - 例如,它将从顶部通过它们,并且它命中的第一个,它会爆发,而不是处理其余的?(或者如果那里有黄色,也许有一种方法可以让“BIRD”正则表达式忽略)。

还有一个额外的问题 - 是否有更好或更惯用的方式来组织这些正则表达式和回复?某种查找表之类的?

4

2 回答 2

1

尝试这个:

robot.hear /CAT/i, (msg) ->
    msg.send "This is a URL - www.example.com/browse/cats"
    msg.finish()
robot.hear /YELLOWBIRD/i, (msg) ->
    msg.send "This is a URL - www.example.com/browse/yellowbirds"
    msg.finish()
robot.hear /BIRD/i, (msg) ->
    msg.send "This is a URL - www.example.com/browse/birds"
    msg.finish()
于 2016-12-22T11:36:15.103 回答
0

您说您正在寻找words但您的正则表达式正在寻找strings。如果你真的想匹配单词,那么你可以在你的正则表达式中加入一些\bs :

\b
匹配零宽度的单词边界,例如字母和空格之间。

所以你可以说:

robot.hear /\bCAT\b/i, (msg) -> ...
robot.hear /\bYELLOWBIRD\b/i, (msg) -> ...
robot.hear /\bBIRD\b/i, (msg) -> ...

以便您的/\bBIRD\b/i将匹配'big bird'但不匹配'angry yellowbird'or 'blackbird pie'

如果您仍然想匹配,'blackbird'那么您可以在混合中加入一个简单的条件,如下所示:

robot.hear /(\S*)bird/i, (msg) ->
  if((msg.match[1] || '').toLowerCase() !== 'yellow')
    # respond in here...

我没有可以轻松使用的 Hubot 设置,因此最后一个可能不太正确,但希望它足够接近来说明这个想法。

于 2014-09-24T02:59:37.697 回答