Java регулярное выражение: проверить, если слово содержит не буквенно-цифровые символы - PullRequest
18 голосов
/ 01 апреля 2011

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

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

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

Ответы [ 8 ]

16 голосов
/ 01 апреля 2011

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

.*\\W+.*
4 голосов
/ 02 марта 2016

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

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

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

4 голосов
/ 01 апреля 2011

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

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

Когда оно оценивается как ложное, это означает, что не совпадает, значит, вы нашли то, что хотели.

3 голосов
/ 01 апреля 2011

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

Сопоставитель был объявлен как 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;
}

Кстати, было бы достаточно, если бы вы просто:

boolean found = m.find();

:)

2 голосов
/ 01 апреля 2011

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

1 голос
/ 01 апреля 2011

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

boolean found = false;
for (int i=0;i<mystring.length();++i) {
  if (!Character.isLetterOrDigit(mystring.charAt(i))) {
    found=true;
    break;
  }
}
0 голосов
/ 12 мая 2016
if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work.
    System.out.println("match");
} else {
    System.out.println("no match");
}
0 голосов
/ 01 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...