Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coffeescript 每行多个令牌上的Hubot匹配?_Coffeescript_Hubot - Fatal编程技术网

Coffeescript 每行多个令牌上的Hubot匹配?

Coffeescript 每行多个令牌上的Hubot匹配?,coffeescript,hubot,Coffeescript,Hubot,如何在单个消息中多次出现令牌时进行匹配 module.exports = (robot) -> robot.hear /ITEM=(\d+)/, (msg) -> msg.send 'matched='+msg.match 我希望能够匹配: blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah 但是,我只获得与上述代码的第一个匹配项: 匹配=废话废话项目=100项目=200项目=300废话,项目=100 我总是可以接收

如何在单个消息中多次出现令牌时进行匹配

module.exports = (robot) ->
  robot.hear /ITEM=(\d+)/, (msg) ->
    msg.send 'matched='+msg.match
我希望能够匹配:

blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah
但是,我只获得与上述代码的第一个匹配项:

匹配=废话废话项目=100项目=200项目=300废话,项目=100


我总是可以接收消息并手动解析每个项目的每一行,但似乎使用robot.hear应该可以做到这一点。

使用两步方法,但您可以做一些事情使其更加简洁:

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' ]

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


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


然后,所有匹配都可以在
msg.match

中找到。这里的缺点是,您无法将匹配限制为特定前缀(即,这将匹配“derp derp ITEM=1 ITEM=2”和“hi hi ITEM=1 ITEM=2”)。根据您的使用情况,这可能是不需要的。但如果您不关心前缀匹配,则此选项会更容易。