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

Javascript Hubot正则表达式-在第一场比赛中停止,而不是尝试所有的正则表达式?,javascript,regex,coffeescript,hubot,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" rob

我有一个简单的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)的子串

在本例中,我只想在更具体的regex(YELLOWBIRD)上触发

但是,Hubot当前正在两个正则表达式上触发-即它将发送:

This is a URL - www.example.com/browse/yellowbirds
This is a URL - www.example.com/browse/birds
有没有办法让Hubot将正则表达式列表当作一个案例来处理——就像在中一样,它将从顶部开始处理正则表达式列表,当它遇到第一个正则表达式时,它将爆发,而不是处理其余的正则表达式?(或者有一种方法可以让“BIRD”正则表达式忽略黄色的部分)


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

你说你在找单词,但你的正则表达式在找字符串。如果你真的想匹配单词,那么你可以在正则表达式中添加一些:

\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设置,所以最后一个可能不太正确,但希望它足够近,可以说明这个想法。

试试这个:

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()
msg.finish()
真的帮助我放松了hubot