Чтобы соответствовать строке, которая содержит только символы ASCII и содержит хотя бы одну букву ASCII, вы можете использовать
s.matches("[\\p{ASCII}&&[^A-Za-z]]*[A-Za-z]\\p{ASCII}*")
См. эту демонстрацию Java
Если выне хотите разрешать контрольные символы во входных данных, используйте вариант шаблона:
s.matches("[ -~&&[^A-Za-z]]*[A-Za-z][ -~]*")
См. эту демонстрацию Java .
Обратите внимание, что .matches
требуетполное совпадение строк, следовательно, нет необходимости добавлять ^
и $
/ \z
якоря вокруг шаблона.
Детали шаблона
[ -~&&[^A-Za-z]]*
- 0 или более печатных символов ASCII, кроме букв ASCII (&&[^...]
- это вычитание класса символов , оно здесь, чтобы заставить шаблон работать быстрее, эффективнее) [A-Za-z]
- буква ASCII (= \p{Alpha}
) [ -~]*
- 0 или более печатных символов ASCII.
Класс свойств \p{ASCII}
Unicode соответствует любым символам ASCII.
Дополнительная информация
Если вам нужно сопоставить строку только с определенными буквами алфавита / алфавита и любым другимr символов в строке, вы можете использовать
s.matches("\\P{L}*(?:[A-Za-z]\\P{L}*)+")
Это [A-Za-z]
для английского языка, для русского языка вы должны использовать [а-яА-ЯёЁ]
.
Теперь, скажем, вы хотите, чтобы соответствоватьстрока, буквы которой могут быть только еврейскими буквами внутри.Поскольку \p{InHebrew}
содержит все буквы на иврите, а не только буквы, вы должны использовать пересечение этого класса и букву \p{L}
, [\p{InHebrew}&&[\p{L}]]
:
str.matches("\\P{L}*(?:[\\p{InHebrew}&&[\\p{L}]]\\P{L}*)+")
^^^^^^^^^^^^^^^^^^^^^^^^^