2014-09-21 2 views
0

Моя следующая программа печатает странные результаты, которые я не понимаю, я думаю, это связано с моим отсутствием большого понимания Java Regex. Поэтому я хочу сначала разделить testStr на период, а затем проверить, содержит ли каждое предложение алфавит или числа. Но удивительно, что я получил следующий вывод, который противоположен моему желанию:Java Regex: проверьте, содержит ли предложение только алфавит и цифры

blah blah1 is not a character! 
blah blah2 is not a character! 
blah blah3 is not a character! 
??** is not a character!  // only this output is expected 

мой код ниже:

String testStr = "blah blah1. blah blah2. blah blah3. ??**..."; 
String[] myStrArray = testStr.split("[.]"); 

System.out.println("length of myStrArray is: " + myStrArray.length); 

for (String str : myStrArray) { 
    if (!Pattern.matches("\\w+", str)) { 
     System.out.println(str + " is not a character!"); 
     continue; 
    } 

    System.out.println("got a meaningful sentence " + str.trim()); 

} 
+1

Каков ваш ожидаемый результат? –

+0

Я ожидаю получить «полезное предложение» для всех предложений, кроме ** ** – TonyGW

+0

'blah blah1 не является символом!' Содержит не только алфавиты, но и пробелы и '!' –

ответ

3

Ваша программа разбивает строку, используя точку в качестве разделителя, так что вы получите:

blah blah1 
blah blah2 
blah blah3 
??**... 

Затем вы пытаетесь матч каждой строки с использованием регулярных выражений \w+. Обратите внимание, что звонок match() эквивалентен вызову find(), но с регулярным выражением, которое включает в себя ^ и $, то есть думаю, что ваше регулярное выражение - ^\w+$.

Я думаю, что теперь очевидно, что любая из ваших строк не соответствует этому шаблону, потому что три первые строки содержат пробел, а последнее не содержит ни символов алфавита, ни цифр.

2

Измените регулярное выражение: ^[a-zA-Z0-9\s]+$ это позволит только символы, цифры и пробелы как требуется. обратите внимание, что частью «магии» является использование ^ и $, которые вынуждают полное совпадение (от начала до конца).

Кроме того, причина, я использовал a-zA-Z0-9 вместо \w что \w включает _, который не соответствует требованиям.

0

Вы можете использовать набор символов. Измените регулярное выражение вы используете ("\\w+") к этому:

"[\\s&&[^\\W_]]" 

Это позволит alphanumerals ([^\W_] =>a-zA-Z0-9) и пробельные символы (\s) быть согласованы, а не только буквы.

Смежные вопросы