【问题标题】:String pattern to regex字符串模式到正则表达式
【发布时间】:2017-03-08 23:00:05
【问题描述】:

我正在使用 mongodb 来存储数据。我想将完整的正则表达式存储为字符串:

{
  permissions: [{
    resName: '/user[1-5]/ig',
    isRegex: true
  }]
}

我知道有模块mongoose-regexp 可以存储正则表达式,但我想将正则表达式和字符串存储在同一个字段中。

我已经使用eval(user.permissions[i].resName).test(resName) 实现了它。我想知道这是否是正确的方法以及是否有任何替代方法(即使用new RegExp(...)

编辑

我试图避免eval,因为此字段来自用户输入,如果将恶意内容发送到 db,则可能会出现问题。

【问题讨论】:

  • 您可以使用new RegExp,但您需要删除分隔符(/)并分隔标志(ig
  • 或者用正则表达式解析它们。 :-)

标签: javascript regex node.js mongodb


【解决方案1】:

这应该会让你到达那里

const rxFinder = /^\/(.+)\/((g|i|m|u|y)*)$/
const resName = '/user[1-5]/ig'

const resRx = new RegExp(...rxFinder.exec(resName).slice(1))

console.info(resRx)

const testStrings = ['String for User5, eh', 'Bad User7 string']

testStrings.forEach(str => {
  console.info(JSON.stringify(str), 'is a match:', resRx.test(str))
})

【讨论】:

  • 如果没有标志,此版本将失败。您可能希望将这些设为可选。
  • const matches = /^\/(.+)\/([a-z]*)$/g.exec(resName); 可能会起作用,然后new RegExp(matches[0], matches[1]);,这样标志也将被保留
  • @Miquel 不确定你的意思
  • @Phil 我看到还有大写修饰符,所以rxFinder 的好解决方案可能是/^\/(.+)\/([a-zA-Z]*)$/g。关于速度,如果我理解得很好,使用new RegExp(matches[0], matches[1]); 会更好吗?
  • @Miquel 根据docs for JavaScript's RegExp,标志仅限于gimuy
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2015-07-03
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多