replaceAll() 方法删除数字,但添加空白标记

replaceAll() method removes digits, but adds blank token

我有一个 Java 作业(取自 Programming Pearls),我必须从文本文件中获取输入(使用 Scanner 和 FileReader objects),删除所有标点符号和数字,然后创建一个 ArrayList,每个单词按字母顺序升序排列。然后,我必须打印出每个单词后跟一个带有单词重复(出现)次数的数字,并删除重复项。

我的问题是,我使用的 replaceAll() 方法确实按预期删除了所有内容,但产生了一个意想不到的后果。我的文本中的数字被转换成一个空白标记(单词),然后插入到我的 ArrayList 中。当我检查 ArrayList 字段时,它显示为“”。

我试过各种不同的正则表达式,结果都是一样的。任何人都知道为什么会发生这种情况以及如何避免这种情况?

这是代码摘录: dictionary 是 ArrayList object 和 inFile 是 Scanner object.

dictionary.add(inFile.next().toString().toLowerCase().replaceAll("[^a-zA-z]", "").trim());

非常感谢


对不起,伙计们。我的错。对,应该是这样a-zA-Z。但是什么都没有改变。这是代码和输出:

     public class Dictionary
        { 
            private List <String> dictionary;
            private Scanner inFile; 


            public Dictionary() 
    {

                this.dictionary = new ArrayList<String>();

            } 

            public void parseText ()
    {             
       inFile = new Scanner (new FileReader("C:\Users\User\Desktop\Ovid.txt"));


        while (inFile.hasNext())                    
                  dictionary.add(inFile.next().toString().toLowerCase().replaceAll("[^a-zA-Z]", "").trim());

Collections.sort(dictionary);
}

这是输出(来自 print 语句):

dictiona1.parseText(); 在 这 凉爽的 凉爽的 breeze 的 这 晚上 这 夜莺 桑

甜蜜 歌曲

如你所见,在"sang"之后有一个空行。在未解析的文本中有一个数字(“...唱了 17 首甜美的歌曲”)。当我检查 ArrayList 时也确认了这一点。

非常感谢。

这是您的代码的预期行为。您正在使用的 replaceAll(regex, "") 表示将每个出现的非 a-z 词替换为空的 String “”。然后将该空字符串添加到 List。 您可以在添加 List 的值时避免写入空 String。 打破您的 while 代码(根据最佳实践,您应该始终这样做)并在向列表添加值时进行检查,以便仅将非空值插入到 List.

String next = inFile.next().toLowerCase();
String replaced = next.replaceAll("[^a-zA-Z]", "").trim();
if(!replaced.equals("")){
       dictionary.add(replaced);        
}

在你提供你正在使用的输入字符串之前,我无法猜测你在 sang 之后得到的换行符。

希望对您有所帮助