Ответ 1
Измените регулярное выражение на:
.*\\W+.*
Это мой код, чтобы определить, содержит ли слово какие-либо не буквенно-цифровые символы:
String term = "Hello-World";
boolean found = false;
Pattern p = Pattern.Compile("\\W*");
Matcher m = p.Matcher(term);
if(matcher.find())
found = true;
Мне интересно, неправильно ли выражение регулярного выражения. Я знаю, что "\W"
будет соответствовать любым несловным символам. Любая идея о том, чего я не вижу?
Измените регулярное выражение на:
.*\\W+.*
Это выражение, которое вы ищете:
"^ [A-Za-Z0-9] + $"
Когда он оценивает значение false, это означает, что оно не соответствует, так что вы считаете, что хотите.
Это 2016 или позже, и вы должны думать о международных строках из других алфавитов, а не только латыни. Часто цитируемый [^a-zA-Z]
в этом случае не будет соответствовать. В Java теперь есть лучшие способы:
[^\\p{IsAlphabetic}^\\p{IsDigit}]
Смотрите ссылку (раздел "Классы для юникодовых скриптов, блоков, категорий и двоичных свойств" ). Там также этот ответ, который я нашел полезным.
Методы находятся в неправильном случае.
Матчи были объявлены как m, но использовались в качестве помощника.
Повторение должно быть "одним или несколькими" + вместо "ноль или много" * Это работает правильно:
String term = "Hello-World";
boolean found = false;
Pattern p = Pattern.compile("\\W+");//<-- compile( not Compile(
Matcher m = p.matcher(term); //<-- matcher( not Matcher
if(m.find()) { //<-- m not matcher
found = true;
}
Btw, этого было бы достаточно, если бы вы просто:
boolean found = m.find();
:)
Проблема заключается в '*'
. '*'
соответствует ZERO или нескольким символам. Вы хотите совместить хотя бы один символ без слова, поэтому вы должны использовать '+'
как модификатор количества. Следовательно, сопоставьте \W+
(Capital W там для NON слова)
Ваше выражение не учитывает возможные неанглийские буквы. Это также сложнее, чем нужно. Если вы не используете регулярные выражения по какой-то причине, кроме необходимости (например, ваш профессор сказал вам), вам намного лучше:
boolean found = false;
for (int i=0;i<mystring.length();++i) {
if (!Character.isLetterOrDigit(mystring.charAt(i))) {
found=true;
break;
}
}
Когда мне приходилось делать то же самое, я использую регулярное выражение "(\ w) *" То, что я использую. Не уверен, что capitol w тот же, но я также использовал скобки.
if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work.
System.out.println("match");
} else {
System.out.println("no match");
}