Hubot正则表达式 - 在第一场比赛中停止,而不是尝试所有这些?

时间:2014-09-24 01:31:59

标签: javascript regex coffeescript hubot

我有一个简单的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”正则表达式忽略,如果那里有黄色的话。)

和奖金问题 - 是否可能有更好或更惯用的方式来组织这些正则表达式和回复?某种查找表还是什么?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您说您正在寻找,但您的正则表达式正在寻找字符串。如果你确实想要匹配单词,那么你可以在你的正则表达式中加入一些\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''blackbird pie'匹配。

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

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

我没有Hubot设置,我可以很容易地玩,以便最后一个可能不是很正确,但希望它足够接近,以说明这个想法。