Проверьте строку, которая может содержать любые символы, но буквы из конкретного алфавита / сценария - PullRequest
0 голосов
/ 12 октября 2018

У меня есть эта строка

String s = "Some text, some text!"

Мне нужна контрольная строка, и если эта строка имеет символ из другого языка, например иврит или русский, то возвращает false, в противном случае, если строка содержит только английский символ (необязательно с пробелами)и пункту) верни истину.Строка курса, подобная этой, String s = ", , ." должна возвращать false.

Я пробовал этот код

Pattern pEng = Pattern.compile("\\p{Alpha}+\\p{Space}*\\p{Punct}*\\p{Digit}*");
pEng.matcher(s).matches()

, но его возвращение false

Что я делаю неправильно?Уже потратили много времени на поиск ответа, кто может помочь?

1 Ответ

0 голосов
/ 12 октября 2018

Чтобы соответствовать строке, которая содержит только символы 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}*)+")
                       ^^^^^^^^^^^^^^^^^^^^^^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...