2015-12-23 3 views
0

Я пишу программу для подсчета количества действительных английских слов в текстовом файле. В этом коде я хочу игнорировать слова, содержащие числа/цифры или специальные символы, например «word123», «123word», «word & &», «$ name». В настоящее время моя программа обнаруживает слова, начинающиеся с цифр, например «123number». Однако не удается обнаружить «номер123». Может ли кто-нибудь сказать мне, как мне двигаться дальше? Ниже мой код:проверить, содержит ли слово число или специальный символ

public int wordCounter(String filePath) throws FileNotFoundException{ 
    File f = new File(filePath); 
    Scanner scanner = new Scanner(f); 
    int nonWord = 0; 
    int count = 0; 
    String regex = "[a-zA-Z].*"; 

    while(scanner.hasNext()){ 
     String word = scanner.next(); 
     if(word.matches(regex)){ 
      count++; 
    } 
     else{ 
      nonWord++; 
     } 
    } 
    return count; 
} 
+0

В настоящее время ваше регулярное выражение ищет альфа с последующим любым количеством символов. Я подозреваю, что вы хотите, чтобы он искал один или несколько альфов. Это будет '' [a-zA-Z] + "или более явно' '\\ p {Alpha} +" '. – sprinter

+0

Возможно, вам также потребуется изменить разделитель для сканера. По умолчанию оно соответствует пробелам. Вы, вероятно, нуждаетесь в этом, чтобы соответствовать пунктуации, а в противном случае это будет включено в слова. Я рекомендую 'scanner.useDelimiter (" \\ p {Punct} | \\ p {пробел} ");' – sprinter

ответ

2

Потерять точку:

String regex = "[a-zA-Z]*"; // more correctly "[a-zA-Z]+", but both will work here 

Точка означает «любой символ», но вы хотите, регулярное выражение, которое означает «только состоящее из букв».

Кстати, вы также можете выразить это более лаконично (хотя, возможно, менее читаемо), используя выражение POSIX:

String regex = "\\p{L}+"; 

Регулярное выражение \p{L} означает «любую букву».


Чтобы продлить выражение включить апостроф, который может появиться в начале, например, 'tis, средний, например, can't или конец, например Jesus', но не более чем один раз:

String regex = "(?!([^']*'){2})['\\p{L}]+"; 
+0

Спасибо! Я пробовал использовать «[a-zA-z] *», и он отлично работал. Любая идея, как я могу сделать ее действительной для сокращений и владений? –

+1

@kandarp см. Править для апострофа Kung Fu – Bohemian

1

Использование regex ^[a-zA-Z -] + $ для совпадения слов.

public int wordCounter(String filePath) throws FileNotFoundException 
{ 
File f = new File(filePath); 
Scanner scanner = new Scanner(f); 
int nonWord = 0; 
int count = 0; 
String regex = "^[a-zA-Z-]+$"; 

while(scanner.hasNext()){ 
    String word = scanner.next(); 
    if(word.matches(regex)){ 
     count++; 
} 
    else{ 
     nonWord++; 
    } 
} 
return count; 

}

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