RegEx для разрешения буквенно-цифровых символов в начале и дефиса после него

У меня было требование, где в текстовом поле первый символ должен быть буквенно-цифровым а затем я могу разрешить дефис в дальнейшем в JavaScript.Также нельзя допускать дефис в конце

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

Einstein 20.01.2009 11:29

больше нет - в наши дни многие доменные имена начинаются с цифр

Alnitak 20.01.2009 11:31

Итак, какая строка должна точно совпадать? «-», «а», «а-а», «а - а», «а-а-а»

wvanbergen 20.01.2009 12:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
3
12 576
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$

Черт тебя побери, Джон, ты меня опередил.

UnkwnTech 20.01.2009 10:59

Это позволяет использовать дефис в конце.

wvanbergen 20.01.2009 11:00

правда, это позволяет использовать дефис в конце

GustyWind 20.01.2009 11:01

Действительно - я не рассматривал это как часть вопроса с самого начала. Исправлено, но я удалю свой ответ, так как вы сначала правильно поняли :)

Jon Skeet 20.01.2009 11:01

Восстановлено, поскольку я не верю, что "A-z" - это то же самое, что "A-Za-z"

Jon Skeet 20.01.2009 11:05

@Jon: В классе символов дефис берется буквально, если вы не используете его как разделитель диапазона. Это означает, что вы ставите его первым или последним символом, и все в порядке.

Tomalak 20.01.2009 11:07

Я искал это, и A-z точно такое же, как A-Za-z. Так что мой ответ правильный и более лаконичный. Однако, поскольку ваше регулярное выражение теперь тоже правильное, я удалил свой голос против.

wvanbergen 20.01.2009 11:11

@wvanbergen Я только что проверил его на regextester.com, установлен на JavaScript, и ^ [A-z] * $ соответствует "a_b", а ^ [A-Za-z] * $ - нет.

Jon Skeet 20.01.2009 11:13

@GustlyWind - убрали обратную косую черту - теперь должно работать. Если нет, дайте отрицательный результат.

Jon Skeet 20.01.2009 11:14

Еще одно замечание: наши регулярные выражения требуют, чтобы строка состояла как минимум из двух символов. Это может быть желаемое или нежелательное поведение.

wvanbergen 20.01.2009 11:15

(Также [] ^ `находятся в A-z - посмотрите таблицы ASCII или Unicode.)

Jon Skeet 20.01.2009 11:16

@wvanbergen: Да, длина в вопросе не указана.

Jon Skeet 20.01.2009 11:16

@Jon: См. Функцию, которую я использую function inputAlphaNumericHyphenOnly (e) {var key = keyFromEvent (e); var re = / ^ [a-zA-Z0-9] [a-zA-Z0-9 -] * [a-zA-Z0-9] $ /; return re.test (String.fromCharCode (key)) || commonControlKey (ключ); } Это не позволяет нажимать какие-либо клавиши прямо сейчас

GustyWind 20.01.2009 11:16

Нет, это так. Таблицы ASCII не используются.

wvanbergen 20.01.2009 11:18

Разве дефис не должен быть первым символом в классе, обозначающим дефис, а не указанием диапазона, например [-a-zA-Z0-9]

codybartfast 20.01.2009 11:19

@it зависит: Нет. Прочтите мой комментарий несколькими строчками ранее. ;-) Это просто должно быть однозначно.

Tomalak 20.01.2009 11:20

Регулярное выражение формально правильно в том виде, в котором оно есть сейчас. Можете указать "не работает"?

Tomalak 20.01.2009 11:25

@GustlyWind ваш пример кода показывает, что вы проверяете только последний введенный символ. Вы должны протестировать всю строку. Показанное здесь регулярное выражение возвращает истину только в том случае, если строка содержит не менее 2 символов.

wvanbergen 20.01.2009 11:26

Спасибо WVanbergen, я использую функцию onkeypress, которая заставляет проверять каждый символ. Есть ли какие-то изменения, которые мне нужно сделать. Кроме того, ключ получает код каждой нажатой клавиши.

GustyWind 20.01.2009 11:29

используйте полное значение текстового поля: re.test (document.getElementById ('input-id'). value)

wvanbergen 20.01.2009 11:31

@wvanbergen: Итак, вы утверждаете, что реализация диалекта JavaScript в regextester.com нарушена? Это (eek) зависит от браузера?

Jon Skeet 20.01.2009 11:41

Только что протестировано в Firefox на Linux: var pattern = new RegExp ("^ [A-z] * $"); document.write (pattern.test ("a_c")); печатает "истина". С «^ [A-Za-z] * $» он печатает false.

Jon Skeet 20.01.2009 11:46

Использование регулярного выражения, приведенного выше для длины 1, не позволяет использовать дефис. Можете ли вы проверить это, пожалуйста

GustyWind 20.01.2009 12:03

Ой, моя плохая! Я проверил это на Ruby, и вы правы. Я много лет использую [A-z] ... Думаю, пора мне заняться отладкой :-)

wvanbergen 20.01.2009 12:12

Почему бы не использовать \ d вместо [0-9]?

Keltia 20.01.2009 12:39

@Keltia: Нет особой причины, хотя я думаю, что цифры 0-9 немного более читабельны (среди других диапазонов), и вам не нужно беспокоиться о том, следует ли избегать обратной косой черты.

Jon Skeet 20.01.2009 12:54
Ответ принят как подходящий

Если вы не хотите сочетать несколько тире друг за другом:

^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*$

Это будет соответствовать: a, a-a, aaa-a, aaa-a-aaa-a-aaa-a и т. д.
Но нет: -, -a, a-, a--a, a-a-a-, a-a--a и т. д.

Нужно ли экранировать дефис в конце среднего бита? Я не был уверен.

Jon Skeet 20.01.2009 11:03

A-z допускает использование не-альфа-символов (например, _).

Jon Skeet 20.01.2009 11:05

Дефис не нужно экранировать, если он является последним символом в наборе символов. Однако я не уверен в подчеркивании.

wvanbergen 20.01.2009 11:08

Спасибо за бит-дефис - исправлено.

Jon Skeet 20.01.2009 11:15

Вот вариант POSIX + look-akead:

^[[:alnum:]](?:[[:alnum:]-](?!-$))*$

Это также позволяет использовать только один символ в качестве совпадения. Однако это не так читаемо. ;-)

Обратите внимание, что [[:alnum:]] - это сокращенный предопределенный символьный класс, эквивалентный [a-zA-Z0-9], более эффективный, но в остальном взаимозаменяемый. Не все разновидности регулярных выражений знают эти классы POSIX, используйте традиционную форму, если хотите.

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

^(?:[[:alnum:]]+(?:-(?!$))?)+$

и это не-POSIX форма:

^(?:[a-zA-Z0-9]+(?:-(?!$))?)+$

Ради GustlyWind я очень надеюсь, что ему не нужно поддерживать одиночных персонажей. Это становится радио статическим :)

Jon Skeet 20.01.2009 11:56

Последний вариант, наверное, то, что ему нужно. Более читаемая форма: ^ ([a-zA-Z0-9] + (- [a-zA-Z0-9] +) * $

wvanbergen 20.01.2009 12:14

Опечатка: ^ [a-zA-Z0-9] + (- [a-zA-Z0-9] +) * $

wvanbergen 20.01.2009 12:17

@wvanbergen: Твое хорошо. Вы должны указать это в своем собственном ответе.

Tomalak 20.01.2009 12:35

Я бы предложил:

^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$

Это также соответствует строкам длины 1.

Спасибо, но это не позволяет использовать дефис в javascript. Можете ли вы проверить это, пожалуйста

GustyWind 20.01.2009 12:22

@GustlyWind: Мне нравится: var pattern = new RegExp ("^ [a-zA-Z0-9] ([a-zA-Z0-9 -] * [a-zA-Z0-9])? $» ); document.write (pattern.test ("a-b-c"));

Jon Skeet 20.01.2009 12:58

Другие вопросы по теме