Как совместить буквы только с использованием 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()
для его решения, но хочу знать, можно ли использовать одно регулярное выражение.
Ответы
Ответ 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
}