У меня есть этот небольшой фрагмент кода
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]"))
{
System.out.println(s);
}
}
Предполагается напечатать
dkoe
но он ничего не печатает!!
У меня есть этот небольшой фрагмент кода
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]"))
{
System.out.println(s);
}
}
Предполагается напечатать
dkoe
но он ничего не печатает!!
Добро пожаловать в метод 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()
.
[a-z]
соответствует одиночному char между a и z. Итак, если ваша строка была просто "d"
, например, она бы соответствовала и печаталась.
Вам нужно изменить ваше регулярное выражение на [a-z]+
, чтобы соответствовать одному или нескольким символам.
java-реализация регулярных выражений пытается сопоставить всю строку
который отличается от регулярных выражений perl, которые пытаются найти соответствующую часть
если вы хотите найти строку с ничем, кроме символов нижнего регистра, используйте шаблон [a-z]+
если вы хотите найти строку, содержащую хотя бы один символ нижнего регистра, используйте шаблон .*[a-z].*
String.matches
возвращает, соответствует ли вся строка регулярному выражению, а не только любой подстроке.
Б
String[] words = {"{apf","hum_","dkoe","12f"};
for(String s:words)
{
if(s.matches("[a-z]+"))
{
System.out.println(s);
}
}
Я столкнулся с одной и той же проблемой:
Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");
Вышеуказанное не удалось!
Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");
Вышеописанная работа с шаблоном в пределах (
и )
.
Ваше регулярное выражение [a-z]
не соответствует dkoe
, так как оно соответствует только строкам длины 1. Используйте что-то вроде [a-z]+
.
Вы можете сделать свой шаблонный регистр нечувствительным, выполнив:
Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);