1

如何匹配单个消息中多次出现的令牌。

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 应该能够做到这一点。

4

2 回答 2

1

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

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

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

于 2015-09-18T13:05:31.680 回答
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' ]
于 2015-08-20T00:30:08.957 回答