Ваше регулярное выражение (когда он больше не имеет неправильный формат - не смотрите ниже, как исправить это) всегда будут соответствовать, потому что вы не используете якорь (^
- начало строки, а $
- конец строки) и используйте квант *
(соответствуют 1 или более символам, соответствующим предыдущему подшаблону, как можно больше).
Однако, просто добавив ^
и $
не исправит картину, потому что вы используете 1 обратный слэш с \s
внутри строки C (т.е. внутри строкового литерала «...»). Обратная косая черта рассматривается как escape-символ и не учитывается, так как "\s"
является недопустимой управляющей последовательностью. Внутри класса символов в регулярном выражении (т. Е. В [...]
) дефис создает диапазон . Ваш s-'
создает диапазон от s
(разуметельный код 115) до '
(dec. Code 39). Начиная с в диапазоне внутри символьного класса коды должны идти от самого низкого до самого высокого, выдается ошибка.
Вы можете просто использовать
final String regexpattern = "/^[a-zA-Z\\s-']*$/";
Это возможно потому, что дефис после сокращенного класса \s
не создает диапазон и считается буквальным. Как наилучшая практика, вы можете перенести ее в конец класса персонажа, как это делал xdazz.
Что касается вашего дополнительного вопроса в комментарии:
я должен позволить всем символам за исключение ^<>%*()#!?
Просто используйте отрицание класса символов: пару квадратных скобок с исходным ^
внутри это:
final String regexpattern = "/^[^<>%*()#!^?]*$/";
1 2 3
Здесь первая ^
является якорь начала строки, а второй карет - это отрицание символов внутри класса символов. Третий карет - это буквальный символ ^
.
Это правильное регулярное выражение. какую ошибку вы получаете? – MElliott