2016-02-16 6 views
3

У меня есть следующее регулярное выражение:Как ограничить длину строки

^[a-zA-Z_][\-_a-zA-Z0-9]* 

Мне нужно, чтобы ограничить его длину до 39 символов. Я попытался следующие, но это не сработало:

^[a-zA-Z_][\-_a-zA-Z0-9]*{,38} 
+2

Примечание стороны: '[_a-Za-z0-9]' имеет тот же охват, как '\ w', поэтому' [\ -_ A-Za-Z0-9] 'может быть заменен by '[- \ w]'. – sp00m

+1

Если это значение '' использовать атрибут maxlength', если это строка, вы можете использовать свойство '.length'. – Tushar

ответ

3

Вам просто нужно использовать ограниченный квантификатор {0,38} и конец анкерной колонны $:

^[a-zA-Z_][-_a-zA-Z0-9]{0,38}$ 
         ^^^^^^

Синтаксис ограниченных кванторов: {min,max}, где параметр max является необязательным, но должен присутствовать минимум. Без $ вы можете совместить 39 первых символов в гораздо более длинной строке.

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

Кроме того, вы можете дополнительно сократить регулярное выражение с /i модификатора:

/^[a-z_][-_a-z0-9]{0,38}$/i 

или даже

/^[a-z_][-\w]{0,38}$/i 

Что касается вопроса с комментарием:

Wouldn» t также эта версия работа (^[a-zA-Z_][-_a-zA-Z0-9]){0,39}$ с 39 лимит символов?

Регулярное выражение соответствует

  • (^[a-zA-Z_][-_a-zA-Z0-9]){0,39} - от 0 до 39 последовательности из ...
    • ^ - начало строки
    • [a-zA-Z_] - один символ из указанного диапазона
    • [-_a-zA-Z0-9] - a sing ле символ из указанного диапазона
  • $ - конец строки

Итак, вам требуется матч включить последовательности от начала строки. Обратите внимание, что начало строки может быть соответствует только один раз. Когда вы укажете число таких последовательностей равным 0, вы будете соответствовать только местоположению в конце строки или 2 символьной строке, например A-.

Посмотрим, что делает регулярное выражение с помощью Word input. Он вычисляет начало строки с ^, затем W с [a-zA-Z_], затем o с [-_a-zA-Z0-9]. Затем группа заканчивается, и это эквивалентно согласованию группы один раз. Поскольку мы можем сопоставить больше последовательностей, регулярное выражение пытается сопоставить r с ^. Это не удается. Итак, следующая позиция повторена и провалилась одинаково, потому что d не является ^ (начало строки). И таким образом конец строки сопоставляется, потому что есть 0 вхождений ^[a-zA-Z_][-_a-zA-Z0-9] и есть конец строки $.

regex demo См

+0

спасибо, не будет также, что версия работает '(^ [a-zA-Z_] [-_ a-zA-Z0-9]) {0,39} $' с лимитом 39 символов? –

+1

Попробуйте ['regex101'] (https://regex101.com/r/xA1lY7/1) - нет, это не так, потому что квантификатор установлен в группу, которая привязана к началу строки. –

+0

спасибо, не могли бы вы рассказать об этом немного _ квантификатор установлен в группу, которая привязана к началу строки_? –

1

попробовать

^[a-zA-Z_][\-_a-zA-Z0-9]{0,38}$ 

[0,38] означает, что количество экземпляров символов, соответствующих [\-_a-zA-Z0-9] может быть от 0 до 38.

0

Я добавляю это в случае, если вы ограничиваете ввод в поле ввода.

Пока не регулярное выражение, я использую эту функцию, и она работает хорошо (я добавлю, что очень важно, чтобы пользователь мог знать, что вы ограничивая длину входного сигнала от UI/UX точки зрения):

limitLength: function(element, lengthOf){ 
    var fieldLength = element.value.length; 
    if(fieldLength <= lengthOf){ 
     return true; 
    } else { 
     var str = element.value; 
     str = str.substring(0, str.length - 1); 
     element.value = str; 
    } 
} 

Использование:

<input type="text" onInput="my.namespace.limitLength(this,39)"> 
Смежные вопросы