Firebase 规则正则表达式问题

Rya*_*ley 3 regex coordinates firebase firebase-security firebase-realtime-database

^([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(([-+]?)([\d]{1,3})((\.)(\d+))?)$
Run Code Online (Sandbox Code Playgroud)

我试图使用上面的这个正则表达式来确认数据是一个有效的坐标。我无法让它与 Firebase 规则一起使用。当我在在线正则表达式测试器中运行正则表达式时,它工作正常,但 Firebase 规则似乎不接受它。

这是我的 Firebase 规则:

".validate": "newData.isString() && newData.val().matches(/^([-+]?)([\d]{1,2})(((\.)(\d+)(,)))(([-+]?)([\d]{1,3})((\.)(\d+))?)$/)"
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个工作?

Wik*_*żew 6

您需要将转义反斜杠加倍,但老实说,您的表达式包含太多冗余分组结构。

.matches(/^[-+]?\\d{1,2}\\.\\d+,[-+]?\\d{1,3}(\\.\\d+)?$/)
Run Code Online (Sandbox Code Playgroud)

或完全避免反斜杠:

.matches(/^[-+]?[0-9]{1,2}[.][0-9]+,[-+]?[0-9]{1,3}([.][0-9]+)?$/)
Run Code Online (Sandbox Code Playgroud)

正则表达式将匹配这个在线演示中的字符串。

详情

  • ^- 字符串的开头(在Firebase regex 中,它仅在模式开头使用时是一个锚点)
  • [-+]?- 1 或 0+-
  • [0-9]{1,2} - 1 或 2 位数字
  • [.] - 一个点
  • [0-9]+ - 1+ 位数字
  • , - 逗号
  • [-+]?- 1 或 0+-
  • [0-9]{1,3} - 1 到 3 位数字
  • ([.][0-9]+)?- 1 或 0 序列.和 1+ 数字(请注意,不支持非捕获组)
  • $- 字符串锚点的结尾(仅当在模式结尾时,$匹配 Firebase 正则表达式中的字符串结尾)。