Правило регулярных выражений Firestore разрешает пробелы, но не начинается и не заканчивается одним, а не всеми пробелами

Я создаю правило regex2 для отображаемого_имени в Firestore. Что должно делать мое правило:

  1. Разрешить также буквенно-цифровые и заглавные буквы, длина строки должна быть от 3 до 16 символов.
  2. Разрешить пробелы, но не все пробелы.
  3. Не начинайте и не заканчивайте пробелом.

Это мое текущее правило. Он удовлетворяет первому требованию, но я застрял со следующими двумя требованиями:

let string_rule = "^[a-zA-Z0-9_-]{3,16}$";

Я попытался добавить другое правило, такое как ^[^\s]+(\s+[^\s]+)*$, но это привело к ошибкам:

!  firestore.rules:29:30 - ERROR Missing a closing "
!  firestore.rules:29:30 - ERROR mismatched input 's' expecting {'&&', '.', '==', '>', '>=', '[', '<', '<=', '-', '%', '!=', '||', '+', ';', '/', '*', '?', 'in', 'is'}
!  firestore.rules:29:34 - ERROR token recognition error at: '\'
!  firestore.rules:29:38 - ERROR token recognition error at: '^'
!  firestore.rules:29:39 - ERROR token recognition error at: '\'

Когда я просто изменил свое правило на "[^\s]", оно потерпело неудачу со следующей ошибкой:

firestore.rules:29:29 - ERROR Missing a closing "
!  firestore.rules:29:29 - ERROR mismatched input 's' expecting {'&&', '.', '==', '>', '>=', '[', '<', '<=', '-', '%', '!=', '||', '+', ';', '/', '*', '?', 'in', 'is'}

Я чувствую, что, возможно, неправильно понял синтаксис правила для пробела. Но из документации RE2 я прочитал: https://github.com/google/re2/wiki/Syntax#perl. \s — это класс символов Perl, и он допускает пробелы, \S не допускает пробелов. Что я здесь сделал не так, и каким должно быть мое правило, чтобы удовлетворить требования?


person Yugue Chen    schedule 04.08.2020    source источник


Ответы (1)


Попробуй это:

^(?!\s)[\w ]{3,16}(?<!\s)$

Это использует отрицательный взгляд вперед/назад, чтобы утверждать, что первое и последнее не являются пробелами.

[a-zA-Z0-9_] совпадает с \w.

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

person Bohemian♦    schedule 05.08.2020