【问题标题】:Firebase matches() doesn't work with regexFirebase 匹配()不适用于正则表达式
【发布时间】:2017-04-20 14:38:08
【问题描述】:

我想在我的 firebase 验证规则中实现这个正则表达式 https://regex101.com/r/9m7vMC/1/(它检查坐标纬度)。这是我的代码:

"coordinate": {
    "latitude": {
        ".validate": "newData.isString() && newData.val().matches(/^(\\+|-)?(?:90(?:(?:\\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\\.[0-9]{1,6})?))$/)"
    }
}

我已经逃脱了+.,因此有双反斜杠\\+\\.

但是这段代码不起作用。当我尝试编写正确的纬度时,出现错误FIREBASE WARNING: update at / failed: permission_denied

【问题讨论】:

  • 你有写权限吗?
  • 是的,当我删除纬度验证时,一切正常。
  • 在正则表达式文字中 - 而不是字符串文字 - 您只需要一个反斜杠来转义 +。您的 \\+ 正在尝试匹配一个或多个反斜杠。
  • 但是在保存(发布)过程中出现错误:Error saving rules - Line 18: Invalid escape: '\+'
  • 我的错误。你说的对。它是 JSON,所以反斜杠被转义了。

标签: regex firebase firebase-realtime-database firebase-security


【解决方案1】:

问题出在正则表达式中的非捕获组 (?:)。

我记得我在 Firebase 数据库中用于验证 ISO 8601 次的正则表达式存在类似问题。将非捕获组更改为捕获组解决了我的问题。

要将非捕获组替换为捕获组,只需从正则表达式中删除 ?: 的使用:

"coordinate": {
  "latitude": {
    ".validate": "newData.isString() && newData.val().matches(/^(\\+|-)?(90((\\.0{1,6})?)|([0-9]|[1-8][0-9])((\\.[0-9]{1,6})?))$/)"
  }
}

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多