Регулярное выражение с проверкой длины [дубликат]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
2
задан Kenta 10 September 2015 в 11:50
поделиться

1 ответ

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

^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
  ^^^^^^^^^^^

Кроме того, я предполагаю, что вы хотите совместить 0 или более букв или цифр с (a-z|A-Z|0-9)*. Он должен выглядеть как [a-zA-Z0-9]* (т. Е. Использовать здесь класс символов).

Почему бы не использовать ограничивающий квантификатор, например {1,15}, в конце?

Квантификаторы применяются только в подшаблон слева, будь то группа или класс символов или буквальный символ. Таким образом, ^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$ будет эффективно ограничивать длину второго класса символов [^$%^&*;:,<>?()\"'] до 1 - 15 символов. ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$ будет «ограничивать» последовательность из двух подшаблонов неограниченной длины (так как *+ тоже может совпадать с неограниченным количеством символов) в 1-15 раз, и мы по-прежнему не ограничиваем длина цельной входной строки .

Как работает ограничение на просмотр?

Правильно выглядит (?=.{1,15}$) позитивный просмотр после ^ начало строки anchor . Это утверждение нулевой ширины , которое возвращает только true или false после проверки того, соответствует ли его подшаблон последующим символам. Таким образом, этот lookahead пытается сопоставить любые 1-15 (из-за символов limit quantifier {1,15}), но строки новой строки в конце строки (из-за якоря $). Если мы удалим якорь $ из lookahead, в lookahead потребуется только строка , содержащая от 1 до 15 символов, но общая длина строки может быть любой.

Если входная строка может содержать последовательность строк новой строки, вы должны использовать конструкцию регулярного выражения [\s\S] с любым символом (она будет работать в JS и других общих вариантах регулярных выражений):

^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
 ^^^^^^^^^^^^^^^^^
5
ответ дан Wiktor Stribiżew 18 August 2018 в 19:27
поделиться
  • 1
    Не совсем уверен, что вам нужно это регулярное выражение. Он будет соответствовать 0 или более буквам или цифрам, а затем 0 или более символов, отличных от символов в наборе $%^&*;:,<>?()"'. Просьба уточнить, какие строки действительны (вы хотите сопоставить), а те, которые не соответствуют действительности. – Wiktor Stribiżew 9 September 2015 в 10:41
  • 2
    Если у вас есть символы новой строки в вашей строке, замените первый взгляд вперед на (?=[\s\S]{1,15}$). – Wiktor Stribiżew 9 September 2015 в 13:10
  • 3
    О, моя ошибка, я знал это уже :( – Devon Parsons 9 September 2015 в 13:11
  • 4
    В C # вышеупомянутый не будет работать при попытке присвоить regEx строке. Нужно ли это делать ^ (? =. {1,15} $) [a-zA-Z0-9] * [^ $% ^ & amp; *;: & lt; & gt; & gt; & quot; () \ & quot; ; '] * $ – Kenta 10 September 2015 в 11:51
  • 5
    @Maximus Принцип контраста - правильный способ войти в ваш шаблон. Речь идет не о ограничении длины входной строки, это особая проблема проверки. Это регулярное выражение не будет работать в JS, BTW. – Wiktor Stribiżew 3 March 2016 в 12:56
Другие вопросы по тегам:

Похожие вопросы: