Java--正则表达式
最近做了一个Java实验,下面是实验要求:
实验类型:验证性
实验目的:掌握Java 语言的字符串处理、文本文件的读写
实验内容:
Java 语言共有 50 个关键字(自行查找相关文档),已知 Java 源程序是以“.java”为
扩展名的文本文件。可以考虑在 Java源程序中共有 3 类元素:
<1> 代码行,可运行的 Java源代码;
<2> 注释行,3种注释均可;
<3> 空行,既无代码,也无注释;
编写一个类名为 JavaCodeAnalyzer的类,实现以下功能:
<1> 该类可以以一个 Java 源程序文件名创建一个对象,如果文件不存在,或扩展名不
是“.java”,应提示文件错误;
<2> 对该源程序文件进行分析其中的:代码行数、注释行数和空行数。说明:行是指以
回车结束的。
<3> 统计并按从多到少输出出现次数最多的 5个关键字及其出现次数。
<4> 统计分析的结果输出到名为:result.txt 的文本文件中,
分析XXXXX.java 源程序的结果:
代码行数:xxx,占xx.xx%
注释行数:xxx,占xx.xx%
空白行数:xxx,占xx.xx%
源程序总行数:xxxx
出现最多的5个关键字是:
关键字1:xx次
关键字2:xx次
关键字3:xx次
关键字4:xx次
关键字5:xx次
分析时间:年-月-日,时-分-秒
在这次实验中,要用到String类中的matches()方法,进而要用到正则表达式。坦率来说,对正则表达式的运用是一头雾水,不知如何下手。经过调试和请教,对于一般的正则表达式可能看懂。为了加深理解,下面来介绍一下正则表达式。
所谓的正则表达式,是对字符串操作的一种逻辑公式。用预先定义好的一些特殊字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
下面来说一些基本的正则表达式的构造:
常用到的是字符类
构造 匹配
字符类 | |
---|---|
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
预定义字符类 | |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
我的代码:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javaanalize;
import java.io.FileNotFoundException;
import java.util.*;
import javax.swing.*;
public class JavaAnalize {
public static void main(String[] args) throws FileNotFoundException {
JavaCodeAnalyzer it = new JavaCodeAnalyzer();
it.lineAnalyze();
it.writeFile();
}
}
class JavaCodeAnalyzer {
private int codeLineNum;
private int commentLineNum;
private int spaceLineNum;
private int allLine;
int[] wordNumber = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
String[] keyword = {"abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "continue", "default",
"do", "double", "else", "extends", "false", "final", "finally", "float", "for", "if", "implements", "import",
"instanceof", "int", "interface", "long", "native", "new", "null", "package", "private",
"protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws",
"transient", "true", "try", "void", "volatile", "while", "goto", "const"};
Calendar date = new GregorianCalendar();
java.io.File file = new java.io.File("");
public void lineAnalyze() throws FileNotFoundException {
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
} else {
System.out.println("没有选择文件");
System.exit(0);
}
if (file.getName().matches("[^\\s]+java")) {
System.out.println("The file " + file.getName() + " is exist!");
} else {
JOptionPane.showMessageDialog(null, "文件类型不正确, 请重新选择!谢谢!");
System.exit(0);
}
Scanner input = new Scanner(file);
boolean comment = false;
while (input.hasNextLine()) {
String lineData = input.nextLine();
allLine++;
if (comment) {
commentLineNum++;
if (lineData.matches(".*\\*/\\s*")) {
comment = false;
}
} else {
if (lineData.matches("\\s*")) {
spaceLineNum++; //空白行加1
} else if (lineData.matches("\\s*/\\*.*")) {
commentLineNum++;//注释行加1
comment = true;
if (lineData.matches(".*\\*/\\s*")) {
comment = false;
}
} else if (lineData.matches("\\s*//.*")) {
commentLineNum++;
} else {
codeLineNum++;//代码行加1
String[] s = lineData.split("[^$_0-9a-zA-Z]");
for (int i = 0; i < keyword.length; i++) {
for (int j = 0; j < s.length; j++) {
if (keyword[i].equals(s[j])) {
wordNumber[i]++;
}
}
}
}
}
}
System.out.println("注释行:" + commentLineNum);
System.out.println("空行 :" + spaceLineNum);
System.out.println("代码行 :" + codeLineNum);
System.out.println("全部行 :" + allLine);
}
public void writeFile() throws FileNotFoundException {
double temp = 0;
int j = 0, n = 0;
java.io.File file1 = new java.io.File("result.txt");
if (file1.exists()) {
file1.delete();
}
java.io.PrintWriter put = new java.io.PrintWriter(file1);
put.println("分析" + file.getName() + "源程序的结果:");
temp = 100 * codeLineNum / allLine;
put.println("代码行数:" + codeLineNum + ",占" + temp + "%");
temp = 100 * commentLineNum / allLine;
put.println("注释行数:" + commentLineNum + ",占" + temp + "%");
temp = 100 * spaceLineNum / allLine;
put.println("空白行数:" + spaceLineNum + ",占" + temp + "%");
put.println("源程序总行数:" + allLine);
put.println("出现最多的5个关键字:");
for (int m = 0; m < 5; m++) {
for (n = 0; n <= keyword.length; n++) {
if (wordNumber[j] <= wordNumber[n]) {
j = n;
}
}
if (wordNumber[j] == 0) {
put.println("其他关键字数都为0个!");
break;
}
put.println("关键字" + keyword[j] + " : " + wordNumber[j] + "次");
wordNumber[j] = -1;
j = 0;
}
put.print("分析时间:" + date.get(Calendar.YEAR) + "-" + date.get(Calendar.MONTH) + "-" + date.get(Calendar.DATE));
put.println("," + date.get(Calendar.HOUR) + "-" + date.get(Calendar.MINUTE) + "-" + date.get(Calendar.SECOND));
put.close();
}
}
选择文件
如果文件类型不正确
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。