Google Cloud Firestore 安全规则中正确的正则表达式语法是什么?

Chr*_*bbe 5 regex re2 firebase firebase-security google-cloud-firestore

编辑:在/sf/answers/3141380511/查看答案后,我仍然不知道为什么有必要使用 双重转义句点,'\\.'特别是因为文档清楚地表明这'\.'是预期的语法(请参阅下面的第二个示例)。答案也引用了第一个示例 ( '.*\..*'),但用双转义 ( '.*\\..*') 进行了修改,但我相信这仍然会失败,原因如下所述。


我试图memberUIDs.some_ID_here在句点字符上拆分字符串,但 Firestore 安全规则文档与规则编辑器中允许的语法之间存在一些差异。

安全规则提供了一种.split()字符串方法:https ://firebase.google.com/docs/firestore/reference/security/#split :

// Allow documents named "user.*" to be uploaded
match /{document} {
  allow write: if user.split('.*\..*')[0] == 'user'
}
Run Code Online (Sandbox Code Playgroud)

文档中还有一个示例,显示了句点字符的分割,具有不同的正则表达式:

// Allow read if a document has the string 'user' in it
match /{document} {
  allow read: if 'user' in document.split('\.');
}
Run Code Online (Sandbox Code Playgroud)

第一个问题与第一个示例有关。如果您实际使用此正则表达式,它会匹配整个字符串,这将不允许您在句点字符上进行分割;它以整个字符串作为分隔符,从而产生一个由两个空字符串组成的数组。

第二个问题是第二个例子。这个正则表达式应该正确工作,并且它可以在在线正则表达式编辑器的测试中工作;但是,在函数中使用此正则表达式时,规则编辑器会引发语法错误split()。事实上,如果您尝试'\.'在任何地方使用该字符串,编辑器会抛出语法错误。

现在,我正在使用'\\.'我的正则表达式,它不会在编辑器中触发语法错误,但我认为它运行不正常:

match /groups/{groupID} {
    allow write: if (
        request.writeFields[0].split('\\.')[0] == 'memberUIDs' &&
        request.writeFields[0].split('\\.')[1] == request.auth.uid
    )
}
Run Code Online (Sandbox Code Playgroud)

似乎文档是错误的,编辑器的语法检查器无法正常工作,或者我从根本上误解了安全规则的工作原理。

这是发生语法错误的屏幕截图:

这是发生语法错误的屏幕截图