Regex не работает в String.matches () - PullRequest
118 голосов
/ 19 января 2012

У меня есть этот маленький кусочек кода

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

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

dkoe

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

Ответы [ 9 ]

284 голосов
/ 19 января 2012

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

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

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

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

36 голосов
/ 19 января 2012

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

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

19 голосов
/ 19 января 2012

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

16 голосов
/ 19 января 2012

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

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

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

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

9 голосов
/ 19 января 2012

Используется

String[] words = {"{apf","hum_","dkoe","12f"};
    for(String s:words)
    {
        if(s.matches("[a-z]+"))
        {
            System.out.println(s);
        }
    }
4 голосов
/ 04 декабря 2015

Однажды я столкнулся с той же проблемой:

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

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

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

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

2 голосов
/ 19 января 2012

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

0 голосов
/ 10 июля 2018

Вы должны поместить по крайней мере () в шаблон для соответствия и исправить шаблон следующим образом:

String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
    if(s.matches("(^[a-z]+$)"))
    {
        System.out.println(s);
    }
}
0 голосов
/ 15 марта 2014

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

Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...