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

Java regex: проверьте, не имеет ли слово алфавитно-цифровые символы

Это мой код, чтобы определить, содержит ли слово какие-либо не буквенно-цифровые символы:

  String term = "Hello-World";
  boolean found = false;
  Pattern p = Pattern.Compile("\\W*");
  Matcher m = p.Matcher(term);
  if(matcher.find())
    found = true;

Мне интересно, неправильно ли выражение регулярного выражения. Я знаю, что "\W" будет соответствовать любым несловным символам. Любая идея о том, чего я не вижу?

4b9b3361

Ответ 1

Измените регулярное выражение на:

.*\\W+.*

Ответ 2

Это выражение, которое вы ищете:

"^ [A-Za-Z0-9] + $"

Когда он оценивает значение false, это означает, что оно не соответствует, так что вы считаете, что хотите.

Ответ 3

Это 2016 или позже, и вы должны думать о международных строках из других алфавитов, а не только латыни. Часто цитируемый [^a-zA-Z] в этом случае не будет соответствовать. В Java теперь есть лучшие способы:

[^\\p{IsAlphabetic}^\\p{IsDigit}]

Смотрите ссылку (раздел "Классы для юникодовых скриптов, блоков, категорий и двоичных свойств" ). Там также этот ответ, который я нашел полезным.

Ответ 4

Методы находятся в неправильном случае.

Матчи были объявлены как 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();

:)

Ответ 5

Проблема заключается в '*'. '*' соответствует ZERO или нескольким символам. Вы хотите совместить хотя бы один символ без слова, поэтому вы должны использовать '+' как модификатор количества. Следовательно, сопоставьте \W+ (Capital W там для NON слова)

Ответ 6

Ваше выражение не учитывает возможные неанглийские буквы. Это также сложнее, чем нужно. Если вы не используете регулярные выражения по какой-то причине, кроме необходимости (например, ваш профессор сказал вам), вам намного лучше:

boolean found = false;
for (int i=0;i<mystring.length();++i) {
  if (!Character.isLetterOrDigit(mystring.charAt(i))) {
    found=true;
    break;
  }
}

Ответ 7

Когда мне приходилось делать то же самое, я использую регулярное выражение "(\ w) *" То, что я использую. Не уверен, что capitol w тот же, но я также использовал скобки.

Ответ 8

if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work.
    System.out.println("match");
} else {
    System.out.println("no match");
}