String matches и contains не работают регулярные выражения

Здраствуйте
Я не могу понять, почему класс String его методы contains и matches не работают у меня с регулярными выражениями. При этом у других данный код работает. у меня java 8. Может быть такое, что в новой версии данные методы были отменены? или я все таки не правильно что то делаю.

P.S. данную задачу другими методами я могу решить. Я протестировал именно эти методы и они выдали такой
странный результат.

package com.javarush.task.task22.task2212;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
Проверка номера телефона
*/
public class Solution {
    public static boolean checkTelNumber(String telNumber)

    {
        System.out.println(telNumber);
        if(telNumber == null) return false;
        Pattern pattern = Pattern.compile("[a-z]+");
        Matcher matcher = pattern.matcher(telNumber); // так работает
        System.out.println("has symbol: " + matcher.find());
        System.out.println("contains: "+telNumber.contains("\\w"));

        System.out.println("matches: " + telNumber.matches("\\w"));
        System.out.println("contains: " + telNumber.contains("[a-z]"));

        return true;
    }

    public static void main(String[] args) {
        System.out.println(checkTelNumber("sd"));    }
}


вывод данного кода

sd
has symbol: true
contains: false
matches: false
contains: false
true

3 комментария

fatfaggy
странно)
в одном месте вы делаете
Pattern pattern = Pattern.compile("[a-z]+");

но потом забываете про плюсик и делаете
System.out.println("contains: "+telNumber.contains("\\w"));
System.out.println("matches: " + telNumber.matches("\\w"));
System.out.println("contains: " + telNumber.contains("[a-z]"));

получается, что тут вы сначала спрашиваете содержит ли строка ровно один какой-то символ
потом спрашиваете, соответствует ли строка шаблону из одного любого символа :)
ну а в конце, примерно то же самое, что и в правильном варианте, но без плюсика)

честно говоря, я не оч силен в регулярках, но беглый поиск привел меня к мысли, что если вы поставите плюсики — то все заработает. ну или если удалите плюсик из «правильного» варианта — то он тоже будет давать такой же результат «странный»
RSeropyan
1. Вот сигнатура метода contains: public boolean contains(CharSequence s).
Т.е. метод contains принимает в качестве параметра CharSequence, а не regex. Вызов метода telNumber.contains("[a-z]") вернёт true, если telNumber = "[a-z]".
2. Описание метода matches() из класса Matcher (что эквивалентно вызову matches() для строки): Attempts to match the entire region against the pattern..
Т.е. метод определяет соответствует ли вся строка ЦЕЛИКОМ данному регулярному выражению. В вашем случае вызов telNumber.matches("\\w")) пытается определить состоит ли telNumber из ОДНОЙ буквы. У вас telNumber — это не одна буква, а две («sd»), поэтому результат false. Замените на telNumber.matches("\\w+")) и получите true.
mercurygermes
спасибо все понял. значит contains не принимает regex. Спасибо всем «fatfaggy» и «RSeropyan»
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.