Строгий тест регулярных выражений

#javascript #regex

#javascript #регулярное выражение

Вопрос:

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

Вот мое регулярное выражение; /[a-zA-Z0-9][a-zA-Z0-9-]*.myshopify.com/

например, когда я тестирую это с помощью, myshop.myshopify.coma он возвращает true или myshop.myshopify.com myshop123.myshopify.com все еще возвращает true

То, что я пытаюсь получить, — это если пользователь вводит myshop.myshopify.coma или myshop321.myshopify.com myshop123.myshopify.coma оно не должно совпадать.

Он должен совпадать только тогда, когда весь ввод точно такой [все, кроме ()=>% $ etc] .myshopify.com

что я должен включить в свое регулярное выражение, чтобы строго проверять только одну вещь.

Комментарии:

1. использование ^ и $

2. спасибо за ответ. Где я должен их использовать?

3. ^ в начале вашего шаблона и $ в конце. то есть /^[a-zA-Z0-9][a-zA-Z0-9-]*.myshopify.com$/

4. проверьте это, чтобы понять больше: Утверждения регулярных выражений MDN

5. [a-zA-Z0-9][a-zA-Z0-9-]*.myshopify.com мне это кажется правильным, проверьте здесь: regextester.com

Ответ №1:

вы можете использовать утверждения граничного типа для сопоставления начала ввода ( ^ ) и конца ( $ ) — чтобы убедиться, что ваш ввод полностью совпадает.

 const pattern = /^[a-zA-Z0-9][a-zA-Z0-9-]*.myshopify.com$/

console.log(pattern.test('myshop.myshopify.com')) // true
console.log(pattern.test('myshop.myshopify.coma')) // false
console.log(pattern.test('myshop.myshopify.com myshop123.myshopify.com')) // false 

Ответ №2:

В настоящее время вы допускаете ввод типа «A —«, поэтому, помимо хорошего замечания о привязках начальной и конечной строк, вы, возможно, захотите пересмотреть свой шаблон. Может быть, что-то вроде:

 ^[a-zd] (?:-[a-zd] )*.myshopify.com$
 

Смотрите онлайн-демонстрацию

  • ^ — Привязка начальной строки.
  • [a-zd] — 1 любой символ alnum.
  • (?: — Открыть группу без захвата:
    • -[a-zd] — Буквенный дефис, за которым следуют символы 1 alnum.
    • )* — Закройте группу без захвата и сопоставьте ее с нулем или более раз.
  • .myshopify.com — Соответствует «.myshopify.com » в буквальном смысле.
  • $ — Привязка конечной строки.

Вторым вариантом было бы использовать отрицательный прогноз для достижения той же концепции:

 ^(?!-|.*-[-.])[a-zd-] .myshopify.com$
 

Смотрите онлайн-демонстрацию

  • ^ — Привязка начальной строки.
  • (?! — Отрицательный прогноз для:
    • - — Ведущее изменение
    • | — Или:
    • .*-[-.] — Любой символ, отличный от нуля новой строки или более раз, вплоть до дефиса с другим дефисом или буквенной точкой.
    • ) — Закрыть отрицательный прогноз.
  • [a-zA-Zd] — 1 любой символ alnum.
  • .myshopify.com — Соответствует «.myshopify.com » в буквальном смысле.
  • $ — Привязка конечной строки.

В обоих случаях я использовал как глобальные, так и нечувствительные к регистру флаги : /<pattern>/gi . Смотрите пример ниже:

 const patt1 = /^[a-zd] (?:-[a-zd] )*.myshopify.com$/gi
console.log(patt1.test('myshop.myshopify.com'))
console.log(patt1.test('myshop-.myshopify.com'))

const patt2 = /^(?!-|.*-[-.])[a-zd-] .myshopify.com$/gi
console.log(patt2.test('myshop.myshopify.com'))
console.log(patt2.test('myshop-.myshopify.com')) 

Комментарии:

1. спасибо за ответ. Я посмотрел на ваш и попробовал сам, на самом деле это намного лучше, но пользователь может иметь a----b----b----c.myshopify.com или zubido35----.myshopify.com Я знаю, что это странно, но это все еще необязательный ответ, но не для этого конкретного вопроса

2. @AhmetK, ну, это действительно странно выглядящие допустимые входные данные. В любом случае. У вас есть свой ответ =).