Есть ли альтернатива для положительного и отрицательного просмотра вперед и отрицательного просмотра назад для моего REGEX, которая будет работать в Safari? - PullRequest
1 голос
/ 29 мая 2020

У меня есть REGEX для проверки действительности имени пользователя, которое выглядит следующим образом:

/^(?=.{5,30}$)(?![_.-])(?!.*[_.-]{2})[a-zA-Z0-9._-]+(?<![_.-])$/

В основном мое имя пользователя имеет следующие ограничения:

  • он должен состоять из 5-30 символов,
  • он может содержать любые буквенно-цифровые c [az AZ 0-9] символы,
  • он может содержать такие символы, как _.-
    • он не может начинаться или заканчиваться этими символами
    • символы не могут находиться рядом друг с другом

Этот REGEX отлично работает в Chrome, но, как мы все знаем, Safari не поддерживает ретроспективный просмотр в REGEX. Однако я не уверен, поддерживают ли они опережающий просмотр.

Мой вопрос: есть ли способ преобразовать этот REGEX в то, что понимает Safari?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете использовать следующее регулярное выражение.

^(?=.{5,30}$)[a-z0-9]+(?:[._-][a-z0-9]+)*[a-z0-9]*$

с установленным флагом без учета регистра.

Механизм регулярных выражений выполняет следующие операции.

^             match beginning of string
(?=.{5,30}$)  assert string contains 5-30 chars 
[a-z0-9]+     match 1+ alphanumeric chars
(?:           begin non-capture group
  [._-]       match one char in char class
  [a-z0-9]+   match 1+ chars in char class
)*            end non-cap group and execute 0+ times
[a-z0-9]*     match 0+ chars in char class
$             # match end of line
1 голос
/ 29 мая 2020

Вы можете перефразировать свое регулярное выражение как:

/^(?=.{5,30}$)(?![_.-])(?!.*[_.-]{2})[a-zA-Z0-9._-]*[a-zA-Z0-9]$/
                                                     ^^^ change is here

logi c, который я использую, полагается на то, что единственной целью отрицательного просмотра назад в конце шаблона было утверждение, что последний символ является не точкой, подчеркиванием или дефисом. Вместо этого мы можем просто использовать класс символов, чтобы справиться с этим. Обратите внимание, что в качестве побочного эффекта непосредственно предыдущий класс символов становится нулевым или более раз, поскольку теперь одно или несколько требований всегда будут выполняться последним символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...