编辑:在https://stackoverflow.com/a/44876864/6792075查看答案后,我仍然不知道为什么有必要使用'\\.'
双倍逃避这段时间,特别是因为文档清楚地显示{{1}是预期的语法(参见下面的第二个例子)。答案也引用了第一个例子('\.'
),但是用双重转义('.*\..*'
)进行了修改,但我相信这仍然会因为我在下面描述的原因而失败。
我正在尝试在句点字符上拆分字符串'.*\\..*'
,但Firestore安全规则文档与规则编辑器中允许的语法之间存在一些差异。
安全规则为字符串提供memberUIDs.some_ID_here
方法:https://firebase.google.com/docs/firestore/reference/security/#split:
.split()
在文档中还有一个示例显示了对句点字符的拆分,使用了不同的正则表达式:
// Allow documents named "user.*" to be uploaded
match /{document} {
allow write: if user.split('.*\..*')[0] == 'user'
}
第一个问题是第一个例子。如果您实际使用此正则表达式,它将匹配整个字符串,这将不允许您拆分句点字符;它将整个字符串作为分隔符,从而产生一个包含两个空字符串的数组。
第二个问题是第二个例子。这个正则表达式应该可以正常工作,它适用于在线正则表达式编辑器的测试;但是,当在// Allow read if a document has the string 'user' in it
match /{document} {
allow read: if 'user' in document.split('\.');
}
函数中使用时,规则编辑器会在此正则表达式上抛出语法错误。实际上,如果您尝试在任何地方使用字符串split()
,编辑器会抛出语法错误。
现在,我正在使用'\.'
作为我的正则表达式,它不会在编辑器中触发语法错误,但我认为这不正常:
'\\.'
似乎文档错误,编辑器的语法检查工作不正常,或者我从根本上误解了安全规则的工作原理。
以下是发生语法错误的屏幕截图: