Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Вы не можете применять кванторы к якорям. Вместо этого, чтобы ограничить длину входной строки, используйте 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]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^^^^^^^
$%^&*;:,<>?()"'
. Просьба уточнить, какие строки действительны (вы хотите сопоставить), а те, которые не соответствуют действительности. – Wiktor Stribiżew 9 September 2015 в 10:41(?=[\s\S]{1,15}$)
. – Wiktor Stribiżew 9 September 2015 в 13:10