#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, ну, это действительно странно выглядящие допустимые входные данные. В любом случае. У вас есть свой ответ =).