每行多个令牌Hubot匹配?(Hubot matching on multiple tokens p

2019-10-23 07:01发布

我怎样才能匹配在一个消息令牌的多次出现。

module.exports = (robot) ->
  robot.hear /ITEM=(\d+)/, (msg) ->
    msg.send 'matched='+msg.match

我想能够匹配:

blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah

但是我只得到与上面的代码的第一场比赛:

匹配=等等等等等等ITEM = 100 ITEM = 200 ITEM = 300等等等等,ITEM = 100

我总是可以只取消息和手动分析每一行对每个项目,但似乎使用robot.hear应该能够做到这一点。

Answer 1:

使用两步法,但你可以做一些事情让它多了几分简洁:

coffee> input = "blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah"
'blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah'
coffee> match = input.match /blah blah blah ((ITEM=\d+\s*)+) blah blah$/
[ 'blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah',
  'ITEM=100 ITEM=200 ITEM=300',
  'ITEM=300',
  index: 0,
  input: 'blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah' ]
coffee> match[1].match /(ITEM=\d+)/g
[ 'ITEM=100',
  'ITEM=200',
  'ITEM=300' ]


Answer 2:

您可以通过使用避免了中间匹配g标志传递给正则表达式hear 。 例如:

module.exports = (robot) -> robot.hear /ITEM=(\d+)/g, (msg) -> msg.send 'matched='+msg.match.join(',')

所有的比赛都是那么可用msg.match



文章来源: Hubot matching on multiple tokens per line?