2014-01-09 4 views
1

У меня есть следующий (не работает) регулярное выражениеРегулярное выражение для обеспечения длины проверяет слишком

(^$|(([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?))((^([a-zA-Z0-9]{8})$)|(^([a-zA-Z0-9]{11})$))) 

Позвольте мне сломать логику.

^$| - первая часть, это по существу означает, что строка равна 0 length, она проверяет истину.

очевидно | обозначает a или.

затем добавляет следующий бит.

([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?) - это формат строки, которая должна соответствовать, в действительности это соответствует BIC (код банковского идентификатора).

Таким образом, мы в конечном итоге с:

pattern: '(^$|([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?))' 

В основном соответствуют только БИК, если значение было предусмотрено, хорошо до сих пор?

Однако теперь я хочу расширить это, чтобы гарантировать, что строка имеет 8 или 11 символов.

поэтому я придумал этот небольшой запрос, чтобы соответствовать 8 символов: (^([a-zA-Z0-9]{8})$)

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

'(^$|([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?)(^([a-zA-Z0-9]{8})$))' 

Так что на данный момент он не за работой .

Каков правильный способ проверки длины?

Это что-то с синтаксисом, вызывающим проблему?

+1

Вам не хватает OR в регулярном выражении? – Behe

+1

Можете ли вы дать желаемые приемлемые и неприемлемые входы? –

+0

Не думайте, что это должно выглядеть как len (0) ИЛИ (patten AND len (8)) –

ответ

3

I want to extend this to also ensure that the string is either 8 or 11 characters.

Сначала ваше регулярное выражение может быть сокращен до:

([a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?) 

И если вы заметили, вы уже соответствующие длины = 8 или length = 11, поскольку последние 3 альфа-числа являются необязательными. Я бы предложил заключить их с якорями начала/конца для обеспечения длины.

Вашего окончательного регулярное выражение может быть это:

^(?:[a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?)?$ 

PS: Вы действительно не нужен конкретный ^$, чтобы соответствовать, так как я сделал все регулярное выражение опционального, таким образом, позволяя ему соответствовать пустым строкам.

Интернет Рабочая Демо: http://regex101.com/r/lA6jK6

+0

Ничего себе, похоже, это трюк. Спасибо. –

+0

Вы очень желанны, рад, что это сработало. – anubhava

2

Вы можете использовать утверждение lookahead для поиска 8 или 11 символов, за которым следует конец строки.

В PCRE и JS:

(^$|^(?=.{8}(?:.{3})?$)(...)) 
0

Почему вы проверки длины строки с регулярным выражением? Цитата Джейми Завински приходит на ум. Просто используйте string.length() (в любом формате, который существует на используемом вами языке) и сохраняйте регулярное выражение простым; на данный момент вы просто размножаете проблемы для себя, пытаясь сделать все в регулярном выражении.

+0

К сожалению, вы не всегда можете это сделать. Согласовано, если это ваш собственный код, контроль или проверка, но при работе с фреймворками проверки вы часто намного более ограничены. Поэтому обычно вы получаете удобство для 95% проверки, но всегда есть те оставшиеся случаи, когда сама структура ограничивает. –

Смежные вопросы