【问题标题】:Hubot not responding to regex variableHubot 没有响应正则表达式变量
【发布时间】:2018-09-10 20:29:17
【问题描述】:

我一直在玩 Hubot,实际上时间太长了,但我在匹配数组中的字符串时遇到了困难。 replies 是一个包含一些回复的数组。

所以这行得通:

module.exports = (robot) ->
    robot.hear /seb/i, (msg) ->
    msg.send msg.random replies

但是,这不是:

regex = new RegExp triggers.join(), 'gi'

module.exports = (robot) ->
    robot.hear regex, (msg) ->
    msg.send msg.random replies

regex 是由字符串数组的内容组成的字符串。在这种情况下,打印出正则表达式返回 "/seb/i"

有人愿意解释吗?我从来都不是 JavaScript 和 Coffeescript 的忠实粉丝 :)

【问题讨论】:

  • 不应该是triggers.join('|')吗?
  • 显然如此。这只是一个规则吗?为什么它不能用逗号代替正则表达式?请@fardjad 将其添加到正确的答案中,并对我的问题进行可能的解释,我会将其标记为答案。

标签: javascript regex coffeescript hubot


【解决方案1】:

Array.prototype.join 将字符串参数作为分隔符。不指定参数时默认为,

假设我们有以下关键字数组:

const triggers = ["kw1", "kw2", "kw3"]

调用triggers.join() 将返回字符串kw1,kw2,kw3。将其传递给 RegExp 构造函数将创建一个 RegExp 对象that matches the exact string kw1,kw2,kw3 (also ignores case because of the i flag)

为了用一个正则表达式匹配多个关键字,您必须用special-or (|) operator 分隔它们。

所以不是

regex = new RegExp triggers.join(), 'gi'

你应该写

regex = new RegExp triggers.join('|'), 'i'

您可能还想删除g(全局搜索)标志,因为它足以匹配您案例中关键字的第一次出现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多