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

Однако я получаю только первое совпадение с приведенным выше кодом:

match=бла-бла-бла ПУНКТ=100 ПУНКТ=200 ПУНКТ=300 бла-бла,ПУНКТ=100

Я всегда могу просто взять сообщение и вручную проанализировать каждую строку для каждого элемента, но кажется, что с помощью robot.hear это можно сделать.


person AlexC    schedule 05.06.2015    source источник


Ответы (2)


Используйте двухэтапный метод, но вы можете сделать его более кратким:

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' ]
person Michael Ansel    schedule 20.08.2015

Вы можете избежать промежуточного совпадения, используя флаг g в регулярном выражении, переданном в hear. Например:

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

После этого все совпадения будут доступны в msg.match.

person Ben Lings    schedule 18.09.2015
comment
Недостатком здесь является то, что вы теряете возможность ограничить соответствие определенным префиксом (т. е. это будет соответствовать derp derp ITEM=1 ITEM=2' и 'hi hi ITEM=1 ITEM=2'). В зависимости от вашего варианта использования это может быть нежелательно. Этот вариант намного проще, если вас не волнует совпадение префикса. - person Michael Ansel; 22.09.2015