在java中搜索文本文件中包含的文本并将其从另一个文本文件中删除

在java中搜索文本文件中包含的文本并将其从另一个文本文件中删除,java,Java,我有一个java程序输出的文本文件,该程序查找多个文档中提到的人名的频率,并将其写入文件peopleNames.txt,如下所示: article1location\article1 name1:countofname1# name2:countofname2# name3:countofname3# ... article2location\article2 name1:countofname1# name2:countofname2# name3:countofname3# ... arti

我有一个java程序输出的文本文件,该程序查找多个文档中提到的人名的频率,并将其写入文件peopleNames.txt,如下所示:

article1location\article1 name1:countofname1# name2:countofname2# name3:countofname3# ...
article2location\article2 name1:countofname1# name2:countofname2# name3:countofname3# ...
article3location\article3 name1:countofname1# name2:countofname2# name3:countofname3# ...
这些名字对应于每篇文章中确定的人的名字以及他们在文章中出现的频率,大约有90000篇文章。我有另一个文本文件titles.lst,其中包含大约40个不同的标题及其缩写,如先生、夫人、总统、先生等。我想在文件中使用此列表来搜索这些标题,并从peopleNames.txt中删除这些标题。我不知道如何在java中进行,因为我是java新手,需要修改生成peopleNames.txt的java原始代码以适应标题删除

我的程序是确定像约翰·史密斯先生这样的人与约翰·史密斯先生不同,因此删除这些头衔将使我能够更准确地统计文章中提到的姓名


提前感谢您的帮助。

您可以使用正则表达式删除所有实例: 公开课考试{

    public static void main( String[] args ) throws Exception {
        String s = "Mr Tom and Ms Jane";
        s = s.replaceAll("\\bMr\\b|\\bMs\\b", "");
        System.out.println(s);
    }
为了解释这些评论:

    public static void main( String[] args ) throws Exception {
        String [] titles = args;
        String regex = "\\b"+titles[0]+"\\b";
        for (int i=1; i<titles.length; i++) {
            regex += "|\\b" + titles[i] + "\\b";
        }

        String s = "Mr Tom and Ms Jane";
        s = s.replaceAll(regex, "");
        System.out.println(s);
    }
您也可以重复使用replace选项,而不是构建正则表达式。我不知道哪一个更快。我猜这取决于java实现

    public static void main( String[] args ) throws Exception {
        String [] titles = args;
        String s = "Mr Tom and Ms Jane";
        for (int i=1; i<titles.length; i++) {
            s = s.replaceAll("\\b"+titles[0]+"\\b", "");
        }
        System.out.println(s);
    }

可以使用正则表达式删除所有实例: 公开课考试{

    public static void main( String[] args ) throws Exception {
        String s = "Mr Tom and Ms Jane";
        s = s.replaceAll("\\bMr\\b|\\bMs\\b", "");
        System.out.println(s);
    }
为了解释这些评论:

    public static void main( String[] args ) throws Exception {
        String [] titles = args;
        String regex = "\\b"+titles[0]+"\\b";
        for (int i=1; i<titles.length; i++) {
            regex += "|\\b" + titles[i] + "\\b";
        }

        String s = "Mr Tom and Ms Jane";
        s = s.replaceAll(regex, "");
        System.out.println(s);
    }
您也可以重复使用replace选项,而不是构建正则表达式。我不知道哪一个更快。我猜这取决于java实现

    public static void main( String[] args ) throws Exception {
        String [] titles = args;
        String s = "Mr Tom and Ms Jane";
        for (int i=1; i<titles.length; i++) {
            s = s.replaceAll("\\b"+titles[0]+"\\b", "");
        }
        System.out.println(s);
    }
这就是我要做的: 1.解析titles.lst文档并将每个标题放在一个集合中 2.解析peopleNames.txt,每行检查名称是否在标题集中 3.如果是,请将其拆下。 4.检查复式输入,因为John Smith先生和John Smith先生现在将是同一个人。

我将这样做: 1.解析titles.lst文档并将每个标题放在一个集合中 2.解析peopleNames.txt,每行检查名称是否在标题集中 3.如果是,请将其拆下。
4.检查复式输入,因为John Smith先生和John Smith现在将是相同的。

正如您可能知道的,如果一篇文章以全名或标题开头提及某人,那么它可能会开始仅以姓氏来提及其他人。因此,您的列表可能会比应该的大一些。处理这一问题需要遗憾的是,这是一个更为实质性的重写。您可能应该包括titles.lst中的一行示例,因为它可能会帮助人们想出最佳解决方案。您可能知道,如果一篇文章以全名(可能以标题开头)引用某人,那么它可能会开始仅以姓氏引用其余内容。作为结果,您的列表可能比它应该的大一点。不幸的是,处理这一问题需要更实质性的重写。您可能应该包括titles.lst中的一行示例,因为它可能会帮助人们想出最佳解决方案。但是,您如何知道一个人所有可能的头衔呢?总统、先生、夫人、先生、唐、金找到第一个空格并将其拆分更容易。@AsierAranbarri的方法与查找单词[0]的方法相同是Mr,Mrs,Sir,Don,King而不是Potato正如我所说的,你将其拆分。然后你检查它是否在列表中。如果你按照自己的方式进行,每次出现新标题时,你都必须手动更改代码。如果你将第一个空格拆分,然后创建一个方法来检查单词是否在该列表中,你就不需要更改代码。@AsierAranbarri显然不是这段代码不是用于生产的,但它给出了如何实现它的好主意。必须从文件Titles.lst中读取标题,然后构建作为regex传递给replaceAll->s.replaceAllBuildTitleRegExtitles.lst的字符串;在空格上拆分单词并不能像我多次注释的那样工作。有些标题包含空格,就像某些名称包含空格一样n个空格。因此,你的技巧将无法处理它们。简单的是,可靠的否。但是,你如何知道一个人所有可能的头衔?总统、先生、夫人、先生、堂、金……找到第一个空格并将其拆分比较容易。@AsierAranbarri,方法与你找到该单词[0]的方法相同是Mr,Mrs,Sir,Don,King而不是Potato正如我所说的,你将其拆分。然后你检查它是否在列表中。如果你按照自己的方式进行,每次出现新标题时,你都必须手动更改代码。如果你将第一个空格拆分,然后创建一个方法来检查单词是否在该列表中,你就不需要更改代码。@AsierAranbarri显然不是这段代码不是用于生产的,但它给出了如何实现它的好主意。必须从文件Titles.lst读取标题,然后构建作为regex传递给replaceAll->s.replaceAllBuildTitleRegextitles.lst的字符串;在sp上拆分字 ace不起作用,因为我已经评论了不止一次。有些标题包含空格,就像有些名称包含空格一样。因此,您的技术将无法处理它们。简单的是,可靠的不是。