在文本文件中搜索特定的文本行

时间:2015-05-08 17:03:05

标签: java regex java.util.scanner

我的同义词地图有问题。我希望能够在文本文件中搜索关键字或相关单词的文本文件,然后输出找到的句子。所以我的程序会根据关键字或sunonym搜索问题的答案。我的程序的工作方式是在文本文件中搜索问题中的关键字,然后输出问题的答案,该问题是文本文件中的问题之后的下一行。当我在问题中搜索主要关键字时,程序可以正常工作。但是,当我尝试用相关单词提问时,程序无法识别输入。例如,如果我输入“主要是什么?”这个问题的答案是在下一行“主要是困难的”,但如果我输入“焦点如何”,程序无法识别相关单词焦点有人可以帮助我找到问题在于搜索相关单词。这是我的文本文件

 what is the textbook name?
 the textbook name is Java
 how is the major?
 the major is difficult
 how much did the shoes cost?
 the shoes cost two dollars
 how is the major when cramer took it?
 when cramer took it, it was okay
 how is the major when jar took it?
 jar said it was fine
 what is the color of my bag?
 the color of my bag is blue

这是我的代码

 public static class DicEntry {
    String key;
    String[] syns;
    Pattern pattern;

    public DicEntry(String key, String... syns) {
        this.key = key;
        this.syns = syns;
        pattern = Pattern.compile(".*(?:"
                + Stream.concat(Stream.of(key), Stream.of(syns))
                        .map(x -> "\\b" + Pattern.quote(x) + "\\b")
                        .collect(Collectors.joining("|")) + ").*");
    }
}



public static void parseFile(String s) throws IOException {

    List<DicEntry> synonymMap = populateSynonymMap(); // populate the map

    File file = new File("data.txt");
    Scanner scanner = new Scanner(file);
    Scanner forget = new Scanner(System.in);

    int flag_found = 0;

    while (scanner.hasNextLine()) {
        final String lineFromFile = scanner.nextLine();

        for (DicEntry entry : synonymMap) { // iterate over each word of the
                                            // sentence.

            if (entry.pattern.matcher(s).matches()) {

                if (lineFromFile.contains(entry.key)) {

                    //String bat = entry.key;
                    if(lineFromFile.contains(s))      {
                    String temp = scanner.nextLine();
                    System.out.println(temp);



                }
            }
        }
    }
    }


}


private static List<DicEntry> populateSynonymMap() {
    List<DicEntry> responses = new ArrayList<>();
    responses.add(new DicEntry("bag", "purse", "black"));
    responses.add(new DicEntry("shoe", "heels", "gas"));
    responses.add(new DicEntry("major", "discipline", "focus", "study"));

    return responses;
}

public static void getinput() throws IOException {

    Scanner scanner = new Scanner(System.in);
    String input = null;
    /* End Initialization */
    System.out.println("Welcome ");
    System.out.println("What would you like to know?");

    System.out.print("> ");
    input = scanner.nextLine().toLowerCase();
    parseFile(input);
}

public static void main(String args[]) throws ParseException, IOException {
    /* Initialization */
    getinput();

}

}

1 个答案:

答案 0 :(得分:0)

传递后似乎是

if (lineFromFile.contains(entry.key)) 

在您的parseFile(String s)方法中,您可能想知道用户输入的输入是否包含entry.syns中的任何一个,并用密钥替换同义词

// This is case sensitive
boolean synonymFound = false;
for (String synonym : entry.syns) {
    if (s.contains(synonym)) {
        s = s.replace(synonym, entry.key)
        break;
    }
}

由于您希望在找到匹配项(完全匹配或同义词匹配)后停止搜索,因此您希望使用return语句来启动该方法或使用标记来启动while (scanner.hasNextLine())

if (lineFromFile.contains(s)) {
    String temp = scanner.nextLine();
    System.out.println(temp);

    flag_found = 1;

    System.out
            .println(" Would you like to update this information ? ");
    String yellow = forget.nextLine();
    if (yellow.equals("yes")) {
        // String black = scanner.nextLine();
        removedata(temp);
    } else if (yellow.equals("no")) {

        System.out.println("Have a good day");
        // break;
    }

    // Add return statment to end the search
    return;
}

结果:

enter image description here

enter image description here