Как сделать это простое регулярное выражение?

1

Мне нужно, чтобы строка начиналась и заканчивалась буквенно-цифровым диапазоном от 5 до 20 символов, и у него могло быть пробел или нет между символами. /^[az\s?A-Z0-9]{5,20}$/ но это не работает.

РЕДАКТИРОВАТЬ
тестовый тест -should
testtest -should pass
тестовый тестовый тест -should не проходит

  • 1
    уберите этот вопросительный знак
  • 0
    нет, потому что я хочу один пробел или ни одного
Показать ещё 5 комментариев
Теги:

3 ответа

6
Лучший ответ

Вы не можете сделать это с помощью обычного регулярного выражения без написания смехотворно длинного выражения, поэтому вам нужно использовать прогноз:

/^(?=(\w| ){15,20}$)\w+ ?\w+$/

Это говорит о том, что в матче есть от 15 до 20 символов, а затем сопоставление /\w+ \w+/

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

/^(?=[a-zA-Z0-9 ]{15,20}$)[a-zA-Z0-9]+ ?[a-zA-Z0-9]+$/
  • 0
    О, это умно, я не был подвержен взглядам, которые не использовались в конце паттернов. +1
  • 0
    15 должно быть 5 да? Кроме того, прогноз может быть уменьшен до: (?=.{5,20}$) Вот как бы я написал это: /^(?=.{5,20}$)\w+(?: \w+)?$/
2

Вы не можете поставить ? внутри [...]. [... ] используется для точного определения набора символов, вы не можете (?) иметь символ внутри набора символов. Возникновение каких-либо конкретных символов уже является необязательным ? не имеет смысла.

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

if (myString.match(/^[a-z\sA-Z0-9]{5,20}$/ && myString.match(/\s/g).length <= 1)

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

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

if (myString.match(/^[a-z\sA-Z0-9]{5,20}$/ && myString.match(/^[^\s]*\s?[^\s]*$/))) {

Пример использования

inputs = ["test test", "testtest", "test test test"];

for (index in inputs) {
    var myString = inputs[index];
    if (myString.match(/^[a-z\sA-Z0-9]{5,20}$/ && myString.match(/^[^\s]*\s?[^\s]*$/))) {
        console.log(myString + " matches.")
    } else {
        console.log(myString + " does not match.")
    }
}

Это дает результат, указанный в вашем вопросе.

  • 0
    Это хорошее решение, но я хочу, чтобы оно было включено в регулярное выражение
  • 0
    @oYes Это нельзя сделать с помощью одного регулярного выражения, если оно не содержит сотни строк. регулярные выражения не предназначены для таких более сложных грамматик. Я добавил способ сделать это с помощью двух регулярных выражений.
Показать ещё 1 комментарий
0

Meh, Итак, здесь смехотворно длинное традиционное регулярное выражение для того же

(?i)[a-z0-9]+( [a-z0-9]+)?{5,12}

js vesrion (без вложенного квантора)

/^([a-z0-9]( [a-z0-9])?){5,12}$/i
  • 1
    На каком языке это? Perl дает мне ошибку для «вложенных квантификаторов в регулярных выражениях», JavaScript для «нечего повторять», а Python вызывает sre_constants.error: multiple repeat .
  • 0
    Ява . (? i) - флаг без учета регистра, используйте его для языка, который вы используете.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню