Установите минимальные и максимальные символы в регулярном выражении?

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

Мое регулярное выражение:

[A-Za-z](\s?[A-Za-z])+

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

Есть ли способ обеспечить минимум трех символов и максимум 30?

Ответы

Ответ 1

Да

Точно так же, как + означает один или несколько, вы можете использовать {3,30} для соответствия между 3 и 30

Например, [a-z]{3,30} соответствует от 3 до 30 строчных букв алфавита

Из документации класса шаблона

X{n,m}    X, at least n but not more than m times

В вашем случае сопоставление 3-30 букв с последующими пробелами может быть выполнено с помощью

([a-zA-Z]\s){3,30}

Если вам требуется пропустить пробелы, если вы этого не сделаете, вы можете использовать: (2-29 раз букву + пробел, затем букву)

([a-zA-Z]\s){2,29}[a-zA-Z]

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

([a-zA-Z]\s){1,14}[a-zA-Z]

Вы можете добавить \s? к последнему, если конечный пробел является необязательным. Все они были протестированы на RegexPlanet

Если вы хотите, чтобы вся строка в целом составляла от 3 до 30 символов, вы можете использовать lookaheads, добавляя (?=^.{3,30}$) в начале RegExp и удаляя ограничения других размеров

Все, что сказал, честно говоря, я бы просто испытал свойство String .length. Это более читаемо.

Ответ 2

Это то, что вы ищете

^[a-zA-Z](\s?[a-zA-Z]){2,29}$

^ - начало строки

$ - это конец строки

(\s?[a-zA-Z]){2,29} будет соответствовать (\ s? [a-zA-Z]) от 2 до 29 раз.

Ответ 3

Фактически Benjamin ответ приведет к полному решению вопроса OP. Используя lookaheads, можно ограничить общее количество символов и ограничить соответствие заданной комбинацией букв и (необязательных) одиночных пробелов.

Регулярное выражение, которое решает всю проблему, станет

(?=^.{3,30}$)^([A-Za-z][\s]?)+$

Это будет соответствовать AAA, A A, а также не будет соответствовать AA A, так как есть два последовательных пробела. Я тестировал это на http://regexpal.com/, и это делает трюк.

Ответ 4

вы должны использовать

[a-zA-Z ]{20}

[для допустимых символов] {для ограничения количества символов}