Каков правильный синтаксис регулярного выражения в правилах безопасности Google Cloud Firestore?

РЕДАКТИРОВАТЬ: после просмотра ответа на https://stackoverflow.com/a/44876864/6792075 я до сих пор не знаете, почему необходимо дважды экранировать точку с '\\.', особенно потому, что документация ясно показывает, что '\.' является ожидаемым синтаксисом (см. мой второй пример ниже). Ответ также ссылается на первый пример ('.*\..*'), но измененный с помощью двойного экранирования ('.*\\..*'), но я считаю, что это все равно не удастся по причинам, которые я описываю ниже.


Я пытаюсь разделить строку 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'
}

В документах также есть пример, показывающий разделение символа точки с другим регулярным выражением:

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

Первая проблема связана с первым примером. Если вы на самом деле используете это регулярное выражение, оно соответствует всей строке, что не позволит вам разделить символ точки; он принимает всю строку в качестве разделителя, в результате чего получается массив из двух пустых строк.

Вторая проблема связана со вторым примером. Это регулярное выражение должно работать правильно, и оно работает в тестах с онлайн-редакторами регулярных выражений; однако редактор правил выдает синтаксическую ошибку в этом регулярном выражении при использовании в функции split(). Фактически, если вы попытаетесь использовать строку '\.' в любом месте, редактор выдаст синтаксическую ошибку.

Прямо сейчас я использую '\\.' в качестве своего регулярного выражения, которое не вызывает синтаксическую ошибку в редакторе, но я не думаю, что это работает правильно:

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

Похоже, либо документация неверна, либо проверка синтаксиса редактора работает неправильно, либо я что-то в корне не понимаю в том, как работают правила безопасности.

Вот скриншот синтаксической ошибки:

Вот скриншот синтаксической ошибки


person Chris Bobbe    schedule 26.04.2018    source источник
comment
ссылаться. github.com/google/re2/wiki/Синтаксис   -  person rijin    schedule 26.04.2018
comment
Обычно '\.' и '\\.' преобразуются в одно и то же \. в любом редакторе. Однако некоторые редакторы делают глупости и требуют, чтобы экранированный символ был чем-то, что они узнают. Там, где \ вынужден экранироваться, если это литерал (как одинарные, так и двойные кавычки), . может не иметь такой роскоши. Fopa может быть в сообщении об ошибке, что оно говорит?   -  person    schedule 27.04.2018
comment
Я только что добавил скриншот с синтаксической ошибкой. Это также не позволит мне сохранить правила безопасности, поэтому они не могут вступить в силу.   -  person Chris Bobbe    schedule 27.04.2018
comment
Может быть, это проблема только в библиотеке подсветки синтаксиса, а не в исходном коде?   -  person powtac    schedule 19.10.2018