Подтвердить что ты не робот

Как совместить буквы только с использованием java regex, метода совпадений?

import java.util.regex.Pattern;

class HowEasy {
    public boolean matches(String regex) {
        System.out.println(Pattern.matches(regex, "abcABC   "));
        return Pattern.matches(regex, "abcABC");
    }

    public static void main(String[] args) {
        HowEasy words = new HowEasy();
        words.matches("[a-zA-Z]");
    }
}

Выход False. Где я иду не так? Также я хочу проверить, содержит ли слово только буквы и может или не может закончиться с одним периодом. Для чего это регулярное выражение?

i.e "abc" "abc." действителен, но "abc.." недействителен.

Я могу использовать метод indexOf() для его решения, но хочу знать, можно ли использовать одно регулярное выражение.

4b9b3361

Ответ 1

"[a-zA-Z]" соответствует только одному символу. Чтобы сопоставить несколько символов, используйте "[a-zA-Z]+".

Поскольку точка является шутником для любого символа, вы должны ее замаскировать: "abc\." Чтобы сделать точку опцией, вам нужен знак вопроса: "abc\.?"

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

System.out.println ("abc".matches ("abc\\.?"));
System.out.println ("abc.".matches ("abc\\.?"));
System.out.println ("abc..".matches ("abc\\.?"));

Объединяя оба шаблона:

System.out.println ("abc.".matches ("[a-zA-Z]+\\.?"));

Вместо a-zA-Z,\w часто более подходит, поскольку он захватывает иностранных символов, таких как äöüßø и т.д.:

System.out.println ("abc.".matches ("\\w+\\.?"));   

Ответ 2

[A-Za-z ]* для соответствия букв и пробелов.

Ответ 3

matches метод выполняет сопоставление полной строки, т.е. эквивалентно find() с '^ abc $'. Поэтому просто используйте Pattern.compile("[a-zA-Z]").matcher(str).find(). Затем закрепите свое регулярное выражение. Поскольку неизвестно @user, ваше регулярное выражение фактически соответствует только одному символу. Вероятно, вы должны сказать [a-zA-Z]+

Ответ 4

Три проблемы здесь:

  • Просто используйте String.matches() - если API существует, используйте его
  • В java "match" означает "соответствует всему вводу", который IMHO является интуитивно понятным, поэтому пусть ваш API-интерфейс API отражает это, позволяя вызывающим абонентам думать о согласовании части ввода, как показывает ваш пример.
  • Регулярное выражение соответствует только 1 символу

Я рекомендую использовать такой код:

public boolean matches(String regex) {
    regex = "^.*" + regex + ".*$"; // pad with regex to allow partial matching
    System.out.println("abcABC   ".matches(regex));
    return "abcABC   ".matches(regex);
}

public static void main(String[] args) {
    HowEasy words = new HowEasy();
    words.matches("[a-zA-Z]+"); // added "+" (ie 1-to-n of) to character class
}