如何不计算文本文件中的控制字符

时间:2016-03-03 18:08:35

标签: java text io java.util.scanner delimiter

我无法理解如何不计算文本文件中的控制字符。我的程序执行所有操作但跳过控制字符\n \r: 文件内容:好的,经过进一步尝试,我更接近。如果我改变:

 while (input.hasNext()) { 
          String line = input.nextLine();
          lineCount++;
          wordCount += countWords(line);
          charcount += line.length(); 
 to
 while (input.hasNext()) {
          String line = input.next();
          lineCount++;
          wordCount += countWords(line);
          charCount += line.replace("\n", "").replace("\r", "").length();

字数被计算但是它会弄乱线条。如果我添加input.nextLine,它就会混乱。 文本内容:

伤心的狗 狗摇摆

import java.io.*;
import java.util.*;

public class Character_count {

 public static void main(String args[]) throws Exception {

     java.io.File file = new java.io.File("textFile.txt");

        // Create a Scanner for the file
        Scanner input = new Scanner(file);
        int charcount = 0;
        int wordCount = 0;
        int lineCount = 0;

        while (input.hasNext()) {
          String line = input.nextLine();
          lineCount++;
          wordCount += countWords(line);
          charcount += line.length();
        }


        System.out.println("The file " + file + " has ");
        System.out.println(charcount + " characters");
        System.out.println(wordCount + " words");
        System.out.println(lineCount + " lines");

        }

    private static int countWords(String s) {
        Scanner input = new Scanner(s);
            int count = 0;

        while (input.hasNext()) {
            input.next(); 
        count++;
        }
        return count;

  }
}

3 个答案:

答案 0 :(得分:1)

您可以使用Scanner方法通过useDelimiter实现这一目标:

Scanner input = new Scanner(new File("textFile.txt"));
input.useDelimiter("\r\n");

继续像往常一样使用代码,应该可以。

另外(非常重要)如果您选中hasNext(),请使用next(),如果您选中hasNextLine()则使用nextLine()!不要混淆和匹配,因为它会导致(或已经造成)问题。

答案 1 :(得分:1)

您可以将所有\n\r替换为空字符串,如下所示:

line = line.replaceAll("\\r?\\n", "")

现在您可以执行计数,但不会考虑任何\n\r

你可以选择做(不使用正则表达式):

line = line.replace("\n", "").replace("\r", "")

答案 2 :(得分:1)

你好,你应该使用' \ s'在表示空格的正则表达式中

  

\ s代表"空白字符"。同样,这实际包含哪些字符取决于正则表达式的味道。在本教程中讨论的所有风格中,它包括[\ t \ r \ n \ f]。即:\ s匹配空格,制表符,换行符或换页符。(http://www.regular-expressions.info/shorthand.html

所以在这里你如何使用它

update
  • 修改

这是一个简单的修改,它将使其工作

Scanner scanner = new Scanner(path.toFile(),"UTF-8");
    String content = scanner.useDelimiter("\\A").next();
    System.out.println(content);

    Pattern patternLine = Pattern.compile("\\r?\\n");
    Matcher matcherLine = patternLine.matcher(content);
    int numberLines = 1;
    while (matcherLine.find())
        numberLines++;


    Pattern pattern = Pattern.compile("\\s");
    Matcher matcherEliminateWhiteSpace = pattern.matcher(content);
    String contentWithoutWhiteSpace=matcherEliminateWhiteSpace.replaceAll("");


    // it will count only ASCII Charachter a->z A->Z 0->9 _'underscore'
    Pattern patternCharachter=Pattern.compile("\\w");
    Matcher matcherCharachterAscii= patternCharachter.matcher(contentWithoutWhiteSpace);


    int numberCharachtersAscii = 0;
    while (matcherCharachterAscii.find())
        numberCharachtersAscii++;
    //it will count UTF-8 charachters it will count all charachter no matter what script it is like français عربي and punctuation
Pattern patternUniversal= Pattern.compile(".");
    Matcher matcherUniversal= patternUniversal.matcher(contentWithoutWhiteSpace);
    int numberUniversalCharachter=0;
    while(matcherUniversal.find())
    numberUniversalCharachter++;
    System.out
            .println("******************************************************");
    System.out.println(contentWithoutWhiteSpace);
    System.out.println(numberLines);
    System.out.println(numberCharachtersAscii);
    System.out.println(numberUniversalCharachter);

\\ s代表空格[tab cariagReturn lineFeed space formFeed]