Regex не работает в String.matches()

У меня есть этот небольшой фрагмент кода

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("[a-z]"))
    {
        System.out.println(s);
    }
}

Предполагается напечатать

dkoe

но он ничего не печатает!!

Ответ 1

Добро пожаловать в метод Java без названия .matches()... Он пытается и сопоставляет ВСЕ входные данные. К сожалению, другие языки последовали этому примеру: (

Если вы хотите увидеть, соответствует ли регулярное выражение входному тексту, используйте метод Pattern, a Matcher и .find() для сопоставления:

Pattern p = Pattern.compile("[a-z]");
Matcher m = p.matcher(inputstring);
if (m.find())
    // match

Если вам действительно нужно видеть, имеет ли вход только строчные буквы, вы можете использовать .matches(), но вам нужно сопоставить один или несколько символов: добавьте + к вашему классу символов, как в [a-z]+. Или используйте ^[a-z]+$ и .find().

Ответ 2

[a-z] соответствует одиночному char между a и z. Итак, если ваша строка была просто "d", например, она бы соответствовала и печаталась.

Вам нужно изменить ваше регулярное выражение на [a-z]+, чтобы соответствовать одному или нескольким символам.

Ответ 3

java-реализация регулярных выражений пытается сопоставить всю строку

который отличается от регулярных выражений perl, которые пытаются найти соответствующую часть

если вы хотите найти строку с ничем, кроме символов нижнего регистра, используйте шаблон [a-z]+

если вы хотите найти строку, содержащую хотя бы один символ нижнего регистра, используйте шаблон .*[a-z].*

Ответ 4

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

Ответ 5

Б

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }

Ответ 6

Я столкнулся с одной и той же проблемой:

Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");

Вышеуказанное не удалось!

Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");

Вышеописанная работа с шаблоном в пределах ( и ).

Ответ 7

Ваше регулярное выражение [a-z] не соответствует dkoe, так как оно соответствует только строкам длины 1. Используйте что-то вроде [a-z]+.

Ответ 8

Вы можете сделать свой шаблонный регистр нечувствительным, выполнив:

Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);