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





^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$
Черт тебя побери, Джон, ты меня опередил.
Это позволяет использовать дефис в конце.
правда, это позволяет использовать дефис в конце
Действительно - я не рассматривал это как часть вопроса с самого начала. Исправлено, но я удалю свой ответ, так как вы сначала правильно поняли :)
Восстановлено, поскольку я не верю, что "A-z" - это то же самое, что "A-Za-z"
@Jon: В классе символов дефис берется буквально, если вы не используете его как разделитель диапазона. Это означает, что вы ставите его первым или последним символом, и все в порядке.
Я искал это, и A-z точно такое же, как A-Za-z. Так что мой ответ правильный и более лаконичный. Однако, поскольку ваше регулярное выражение теперь тоже правильное, я удалил свой голос против.
@wvanbergen Я только что проверил его на regextester.com, установлен на JavaScript, и ^ [A-z] * $ соответствует "a_b", а ^ [A-Za-z] * $ - нет.
@GustlyWind - убрали обратную косую черту - теперь должно работать. Если нет, дайте отрицательный результат.
Еще одно замечание: наши регулярные выражения требуют, чтобы строка состояла как минимум из двух символов. Это может быть желаемое или нежелательное поведение.
(Также [] ^ `находятся в A-z - посмотрите таблицы ASCII или Unicode.)
@wvanbergen: Да, длина в вопросе не указана.
@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 (ключ); } Это не позволяет нажимать какие-либо клавиши прямо сейчас
Нет, это так. Таблицы ASCII не используются.
Разве дефис не должен быть первым символом в классе, обозначающим дефис, а не указанием диапазона, например [-a-zA-Z0-9]
@it зависит: Нет. Прочтите мой комментарий несколькими строчками ранее. ;-) Это просто должно быть однозначно.
Регулярное выражение формально правильно в том виде, в котором оно есть сейчас. Можете указать "не работает"?
@GustlyWind ваш пример кода показывает, что вы проверяете только последний введенный символ. Вы должны протестировать всю строку. Показанное здесь регулярное выражение возвращает истину только в том случае, если строка содержит не менее 2 символов.
Спасибо WVanbergen, я использую функцию onkeypress, которая заставляет проверять каждый символ. Есть ли какие-то изменения, которые мне нужно сделать. Кроме того, ключ получает код каждой нажатой клавиши.
используйте полное значение текстового поля: re.test (document.getElementById ('input-id'). value)
@wvanbergen: Итак, вы утверждаете, что реализация диалекта JavaScript в regextester.com нарушена? Это (eek) зависит от браузера?
Только что протестировано в Firefox на Linux: var pattern = new RegExp ("^ [A-z] * $"); document.write (pattern.test ("a_c")); печатает "истина". С «^ [A-Za-z] * $» он печатает false.
Использование регулярного выражения, приведенного выше для длины 1, не позволяет использовать дефис. Можете ли вы проверить это, пожалуйста
Ой, моя плохая! Я проверил это на Ruby, и вы правы. Я много лет использую [A-z] ... Думаю, пора мне заняться отладкой :-)
Почему бы не использовать \ d вместо [0-9]?
@Keltia: Нет особой причины, хотя я думаю, что цифры 0-9 немного более читабельны (среди других диапазонов), и вам не нужно беспокоиться о том, следует ли избегать обратной косой черты.
Если вы не хотите сочетать несколько тире друг за другом:
^[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 и т. д.
Нужно ли экранировать дефис в конце среднего бита? Я не был уверен.
A-z допускает использование не-альфа-символов (например, _).
Дефис не нужно экранировать, если он является последним символом в наборе символов. Однако я не уверен в подчеркивании.
Спасибо за бит-дефис - исправлено.
Вот вариант POSIX + look-akead:
^[[:alnum:]](?:[[:alnum:]-](?!-$))*$
Это также позволяет использовать только один символ в качестве совпадения. Однако это не так читаемо. ;-)
Обратите внимание, что [[:alnum:]] - это сокращенный предопределенный символьный класс, эквивалентный [a-zA-Z0-9], более эффективный, но в остальном взаимозаменяемый. Не все разновидности регулярных выражений знают эти классы POSIX, используйте традиционную форму, если хотите.
Вот тот, который не позволяет использовать несколько подряд идущих дефисов, и он короче:
^(?:[[:alnum:]]+(?:-(?!$))?)+$
и это не-POSIX форма:
^(?:[a-zA-Z0-9]+(?:-(?!$))?)+$
Ради GustlyWind я очень надеюсь, что ему не нужно поддерживать одиночных персонажей. Это становится радио статическим :)
Последний вариант, наверное, то, что ему нужно. Более читаемая форма: ^ ([a-zA-Z0-9] + (- [a-zA-Z0-9] +) * $
Опечатка: ^ [a-zA-Z0-9] + (- [a-zA-Z0-9] +) * $
@wvanbergen: Твое хорошо. Вы должны указать это в своем собственном ответе.
Я бы предложил:
^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$
Это также соответствует строкам длины 1.
Спасибо, но это не позволяет использовать дефис в javascript. Можете ли вы проверить это, пожалуйста
@GustlyWind: Мне нравится: var pattern = new RegExp ("^ [a-zA-Z0-9] ([a-zA-Z0-9 -] * [a-zA-Z0-9])? $» ); document.write (pattern.test ("a-b-c"));
Если это используется для проверки правил домена, вам также необходимо запретить числовые символы в начале имени.