我有一个简单的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”正则表达式忽略,如果那里有黄色的话。)
和奖金问题 - 是否可能有更好或更惯用的方式来组织这些正则表达式和回复?某种查找表还是什么?
答案 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)
您说您正在寻找字,但您的正则表达式正在寻找字符串。如果你确实想要匹配单词,那么你可以在你的正则表达式中加入一些\b
s:
\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设置,我可以很容易地玩,以便最后一个可能不是很正确,但希望它足够接近,以说明这个想法。