【问题标题】:Hubot matching on multiple tokens per line?Hubot每行匹配多个令牌?
【发布时间】:2015-08-20 19:12:42
【问题描述】:

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

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=blah blah blah ITEM=100 ITEM=200 ITEM=300 blah blah,ITEM=100

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

【问题讨论】:

    标签: coffeescript hubot


    【解决方案1】:

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

    module.exports = (robot) -> 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 ')。根据您的用例,这可能是不可取的。如果您不关心前缀匹配,此选项会容易得多。
    【解决方案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' ]
    

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2014-08-30
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      相关资源
      最近更新 更多