我无法理解如何不计算文本文件中的控制字符。我的程序执行所有操作但跳过控制字符\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;
}
}
答案 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]