Java从具有撇号和连字符的文件中读取单词并将其计为2个单词

时间:2013-09-09 16:51:08

标签: java text-files java.util.scanner words

我正在编写一个程序,它将从命令行读取两个文件,并查找每个.txt文件中有多少个单词。我已经让我的代码工作,但我需要它将每个撇号计为2个单词,每个连字符计为两个单词。像这样的东西,例如,John将成为两个单独的单词“john”和“s”,而Tick-Tock将成为“tick”和“tock”)。我也不能使用util.regex。这是我的代码“

private void readFile(){
    Scanner scanner = null;
    try {
        scanner = new Scanner(file);
        while (scanner.hasNextLine()){

            String line = scanner.nextLine();
            String[] wordOfLine = line.split("\\W");
            lineNum++;//accumulate line

            //counts all words 
            for (String word : wordOfLine){

                if (word.equals("") || !(isWord(word)))
                    continue;
                words.add(word.toLowerCase());
                if (wordNum + 1 > wordNum){//in case of overflow
                    wordNum++;//accumulate word
                }

                else
                    throw new Error(" word number overflow!");

            }
        }
    } catch (FileNotFoundException e) {
        throw new Error("cannot find file!");
    } finally{
        if (scanner != null)
            scanner.close();
    }
    System.out.println("Test for wordNum "+wordNum); 

}


//check if text is word
private boolean isWord(String text) {
    return text.matches("[a-zA-Z]+");
}

例如,这是我的测试结果:

测试wordNum 54

测试wordNum 49516

文件f1:9行,54个单词,38个不同的单词

文件f2:4666行,49516个单词,5103个不同的单词

f1与预期结果匹配良好 但是f2需要像这样

文件f2:4666行,49714个单词,5216个不同的单词

这里是f2的一些文档 王子

Nicolo Machiavelli

由W. K.万豪翻译

Nicolo Machiavelli,1469年5月3日出生于佛罗伦萨。从1494年到1512年 在佛罗伦萨担任官方职务,其中包括外交使团 各种欧洲法院。 1512年在佛罗伦萨被监禁;后来放逐了 回到了圣卡夏诺。 1527年6月22日在佛罗伦萨去世。

引言

Nicolo Machiavelli于1469年5月3日出生于佛罗伦萨 Bernardo di Nicolo Machiavelli的第二个儿子,一位有名望的律师, 和他的妻子Bartolommea di Stefano Nelli。父母都是会员 佛罗伦萨的老贵族。

1 个答案:

答案 0 :(得分:1)

String[] tokens = "abc-def".split("((?<=-)|(?=-))");
System.out.println(Arrays.toString(tokens));

<强>输出:

[abc, -, def]