从大文本文件问题中匹配java字符串

时间:2014-04-08 01:17:22

标签: java string file text

我想从一个大文本文件中实现字符串匹配的任务。 1.替换所有非字母数字字符 2.计算文本文件中特定术语的编号。例如,匹配术语" tom"。匹配不区分大小写。所以术语" Tom"我应该算一算。但是明天这个词不应算在内。

code template one:
    try {
           in = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile));
        } catch (FileNotFoundException e1) {
           System.out.println("Not found the text file: "+inputFile);
         }
    Scanner scanner = null;
    try {
        while (( line = in.readLine())!=null){  
               String newline=line.replaceAll("[^a-zA-Z0-9\\s]", " ").toLowerCase();
               scanner = new Scanner(newline);
               while (scanner.hasNext()){
                       String term = scanner.next();
                   if (term.equalsIgnoreCase(args[1]))
                   countstr++;
               }
         }
     } catch (IOException e) {
    e.printStackTrace();
    }

code template two:
   try {
        in = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile));
       } catch (FileNotFoundException e1) {
           System.out.println("Not found the text file: "+inputFile);
         }
   Scanner scanner = null;
   try {
        while (( line = in.readLine())!=null){  
               String newline=line.replaceAll("[^a-zA-Z0-9\\s]", " ").toLowerCase();
               String[] strArray=newline.split(" ");//split by blank space
                       for (int =0;i<strArray.length;i++)
                               if (strArray[i].equalsIgnoreCase(args[1]))
                                      countstr++;
               }
         }
     } catch (IOException e) {
    e.printStackTrace();
   }

通过运行这两个代码,我得到了不同的结果,扫描仪看起来是正确的。但是对于大文本文件,扫描仪的运行速度比后者慢得多。任何能告诉我原因并提供更有效解决方案的人。

1 个答案:

答案 0 :(得分:1)

在你的第一个approch。你不需要使用两个扫描仪。扫描仪用&#34;&#34;不是大线的好选择。

您的行已经转换为小写。所以你只需要在外面做一次小写的密钥。并在循环中等于

或获取

String key = String.valueOf(".*?\\b" + "Tom".toLowerCase() + "\\b.*?");
        Pattern p = Pattern.compile(key);
        word = word.toLowerCase().replaceAll("[^a-zA-Z0-9\\s]", "");
        Matcher m = p.matcher(word);
        if (m.find()) {
            countstr++;
        } 

我个人会为大文件选择BufferedReader方法。

String key = String.valueOf(".*?\\b" + args[0].toLowerCase() + "\\b.*?");
         Pattern p = Pattern.compile(key);
         try (final BufferedReader br = Files.newBufferedReader(inputFile,
                    StandardCharsets.UTF_8)) {
                for (String line; (line = br.readLine()) != null;) {
                    // processing the line.
                    line = line.toLowerCase().replaceAll("[^a-zA-Z0-9\\s]", "");
                    Matcher m = p.matcher(line);
                    if (m.find()) {
                        countstr++;
                    }           
                }
         }

在Java 7中提供示例。如果需要,请更改!!