Метод matches.(String regex)

236
21 июля 2017, 02:16

Мне нужно запретить использование цифр, пробелов и разных символов (?, &, %, и т.д.) в строке. Вот так все работает

if(!name.matches("[a-z][A-Z]")) /*...*/

Если записать вот так, не работает

if(name.matches("\\W"))

Пробовал еще несколько вариантов тоже не работало. Вот мне и интересно, что я упускаю? Почему один вариант работает, а другой нет? И еще, можно мне как-то узнать индекс "запрещенного" символа и вывести его? Типо IllegalCharacter: &

Answer 1

String.matches проверяет удовлетворяет ли строка целиком заданному регулярному выражению.

Т.о. name.matches("[a-z][A-Z]") вернет true только если name удовлетворяет выражению [a-z][A-Z], т.е. состоящих из одной строчной буквы (a-z) и одной прописной (A-Z). Например, для строк: aB, zA. Для всех остальных вернется false.

Условие же name.matches("\\W") выполнится только для строк состоящих из одного символа, который не является буквой латинского алфавита или цифрой (\W). Например для строк: [, !, $.

Если хотите проверить, что в строке содержатся только символы латинского алфавита и цифры воспользуйтесь выражением: \\w+ (эквивалентно [a-zA-Z0-9]+)

if(name.matches("\\w+")) {
    //в строке только цифры и латинские буквы
}

И еще, можно мне как-то узнать индекс "запрещенного" символа и вывести его?

Есть разные способы:

  • использовать Pattern

    Pattern pattern = Pattern.compile("\\W");
    Matcher matcher = pattern.matcher(name);
    //если найден запрещенный символ
    if (matcher.find()) {
        //берем первое его вхождение
        int index = matcher.start();
    } else {
        //запрещенных символов нет 
    }
  • перебирать символы самому (возможно, код будет легче читать/редактировать)

    for (int i = 0; i < name.length(); i++) {
        char ch = name.charAt(i);
        if (!isValid(ch)) {
            int index = i;
        }
    }
    boolean isValid(char ch) {
        return (ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
    }
  • использовать String.split, чтобы разбить строку по запрещенным символам

    String[] subs = name.split("\\W", -1);
    if (subs.length == 1) {
        //запрещенных символов нет
    } else if (subs.length > 1) {
        //запрещенные символы есть
        int index = subs[0].length();
    } else {
        //пустая строка
    }
READ ALSO
Андроид приложение на libgdx не запускается

Андроид приложение на libgdx не запускается

Только начал осваивать libgdx, наскребал несколько статей по созданию меню и застрял на таком моменте, что приложение не запускается("Unfortunately,...

406
JavaFX, не могу поставить иконку в TreeView

JavaFX, не могу поставить иконку в TreeView

Изображения видимы, но не ставятся на TreeItem:

475
checkout всех веток через интерфейс Idea

checkout всех веток через интерфейс Idea

Добрый день, коллегиВопрос следующего характера: имеется многомодульный Java-проект

274