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] ab 或 c(简单类)
[^abc] 任何字符,除了 ab 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p[a-dm-p](并集)
[a-z&&[def]] de 或 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();
        
    }
}

选择文件

 

如果文件类型不正确

Java--正则表达式,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。