`

(正则表达式)学习笔记

阅读更多
1、基础知识
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
 
public class Test {  
 
    public static void main(String[] args) {  
        // 简单认识正则表达式的概念  
        // .表示一个字符  
        System.out.println("abc".matches("..."));// 返回true  
 
        // \d表示数字,在java中\要用\\转义表示  
        // 下面的句子意思是把字符里含有字符的地方都替换成-,返回结果为a----a  
        System.out.println("a8729a".replaceAll("\\d", "-"));  
 
        // 下面这个例子不像上面那样直接匹配,而用模式的方式,这样做的好处是  
        // 当你在编译时就把模式准备好了,这样有利于提高程序速度。  
        // 该模式的意思是有a到z的字母,出现三次  
        Pattern p = Pattern.compile("[a-z]{3}");  
        Matcher m = p.matcher("fgh");// 把匹配后的结果保存在Matcher类中  
        System.out.println(m.matches());// 此处Matcher类的matches()方法返回匹配结果true  
 
        // 上面三句等价于以下直接匹配,就是性能上能更好一些。  
        System.out.println("fgha".matches("[a-z]{3}"));  
 
        // 初步认识. * + ?  
        // Reluctant 数量词  
        // X?? X,一次或一次也没有  
        // X*? X,零次或多次  
        // X+? X,一次或多次  
        // X{n}? X,恰好 n 次  
        // X{n,}? X,至少 n 次  
        // X{n,m}? X,至少 n 次,但是不超过 m 次  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p("a".matches("."));// p()为打印函数,见最后  
        p("aa".matches("aa"));  
        p("aaaa".matches("a*"));  
        p("aaaa".matches("a+"));  
        p("".matches("a*"));  
        p("aaaa".matches("a?"));  
        p("".matches("a?"));  
        p("a".matches("a?"));  
        p("214523145234532".matches("\\d{3,100}"));  
        p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));  
        p("192".matches("[0-2][0-9][0-9]"));  
        // 上面\\.就是表示.  
 
        // 范围  
        // 字符类  
        // [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](减去)  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p("a".matches("[abc]"));  
        p("a".matches("[^abc]"));  
        p("A".matches("[a-zA-Z]"));  
        p("A".matches("[a-z]|[A-Z]"));  
        p("A".matches("[a-z[A-Z]]"));  
        p("R".matches("[A-Z&&[RFG]]"));  
 
        // 认识\s \w \d \  
        // 预定义字符类  
        // . 任何字符(与行结束符可能匹配也可能不匹配)  
        // \d 数字:[0-9]  
        // \D 非数字: [^0-9]  
        // \s 空白字符:[ \t\n\x0B\f\r]  
        // \S 非空白字符:[^\s]  
        // \w 单词字符:[a-zA-Z_0-9]  
        // \W 非单词字符:[^\w]  
 
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p(" \n\r\t".matches("\\s{4}"));  
        p(" ".matches("\\S"));  
        p("a_8".matches("\\w{3}"));  
        p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));  
        p("\\".matches("\\\\"));// 在java中\需要用转义字符\\表示,此处要匹配一个\,需要用\\\\的模式来匹配。  
 
        // POSIX 字符类(仅 US-ASCII) POSIX 来匹配的写法,用的不多  
        // \p{Lower} 小写字母字符:[a-z]  
        // \p{Upper} 大写字母字符:[A-Z]  
        // \p{ASCII} 所有 ASCII:[\x00-\x7F]  
        // \p{Alpha} 字母字符:[\p{Lower}\p{Upper}]  
        // \p{Digit} 十进制数字:[0-9]  
        // \p{Alnum} 字母数字字符:[\p{Alpha}\p{Digit}]  
        // \p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~  
        // \p{Graph} 可见字符:[\p{Alnum}\p{Punct}]  
        // \p{Print} 可打印字符:[\p{Graph}\x20]  
        // \p{Blank} 空格或制表符:[ \t]  
        // \p{Cntrl} 控制字符:[\x00-\x1F\x7F]  
        // \p{XDigit} 十六进制数字:[0-9a-fA-F]  
        // \p{Space} 空白字符:[ \t\n\x0B\f\r]  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        // POSIX Style  
        p("a".matches("\\p{Lower}"));  
 
        // 边界匹配器  
        // ^ 行的开头  
        // $ 行的结尾  
        // \b 单词边界  
        // \B 非单词边界  
        // \A 输入的开头  
        // \G 上一个匹配的结尾  
        // \Z 输入的结尾,仅用于最后的结束符(如果有的话)  
        // \z 输入的结尾  
 
        // boundary 边界匹配  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p("hello sir".matches("^h.*"));  
        p("hello sir".matches(".*ir$"));  
        p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));  
        p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));  
 
        // whilte lines 空白行  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));  
 
        // email地址  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p("asdfasdfsafsf@dsdfsdf.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));  
 
        // matches find lookingAt  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        Pattern p2 = Pattern.compile("\\d{3,5}");  
        String s = "123-34345-234-00";  
        Matcher m2 = p2.matcher(s);  
        p(m2.matches());// 匹配整个  
        m2.reset();  
        p(m2.find());// 发现有没有匹配的字符,并截取  
        p(m2.start() + "-" + m.end());// 相匹配的起始位置和结束位置(必须能找到情况下)  
        p(m2.find());  
        p(m2.start() + "-" + m.end());  
        p(m2.find());  
        p(m2.start() + "-" + m.end());  
        p(m2.find());  
        // p(m2.start() + "-" + m.end());  
        p(m2.lookingAt());// 发现有没有匹配的字符,不截取  
        p(m2.lookingAt());  
        p(m2.lookingAt());  
        p(m2.lookingAt());  
 
        // replacement  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        Pattern p3 = Pattern.compile("java", Pattern.CASE_INSENSITIVE);// 忽略大小写Pattern.CASE_INSENSITIVE  
        Matcher m3 = p3  
                .matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");  
        StringBuffer buf = new StringBuffer();  
        int i = 0;  
        while (m3.find()) {  
            i++;  
            if (i % 2 == 0) {// 偶数位置java替换成小写  
                m3.appendReplacement(buf, "java");  
            } else {// 偶数位置java替换成大写  
                m3.appendReplacement(buf, "JAVA");  
            }  
        }  
        // 加上尾巴  
        m3.appendTail(buf);  
        p(buf);  
 
        // group  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        Pattern p4 = Pattern.compile("(\\d{3,5})([a-z]{2})");  
        String s4 = "123aa-34345bb-234cc-00";  
        Matcher m4 = p4.matcher(s4);  
        while (m.find()) {  
            p(m4.group(1));  
        }// p(m4.group(1));将打印第一个小括号匹配的模式结果  
        // 为123 34345 234  
        // p(m4.group(2));将打印第一个小括号匹配的模式结果为aa bb cc  
        // p(m4.group());将打印总的模式结果为123aa 34345bb 234cc  
 
        // 以下三种情况(了解即可),不多用!  
        // Greedy 数量词 (贪婪的))  
        // X? X,一次或一次也没有  
        // X* X,零次或多次  
        // X+ X,一次或多次  
        // X{n} X,恰好 n 次  
        // X{n,} X,至少 n 次  
        // X{n,m} X,至少 n 次,但是不超过 m 次  
        //           
        // Reluctant 数量词 (不情愿的)  
        // X?? X,一次或一次也没有  
        // X*? X,零次或多次  
        // X+? X,一次或多次  
        // X{n}? X,恰好 n 次  
        // X{n,}? X,至少 n 次  
        // X{n,m}? X,至少 n 次,但是不超过 m 次  
        //           
        // Possessive 数量词 (独占的)  
        // X?+ X,一次或一次也没有  
        // X*+ X,零次或多次  
        // X++ X,一次或多次  
        // X{n}+ X,恰好 n 次  
        // X{n,}+ X,至少 n 次  
        // X{n,m}+ X,至少 n 次,但是不超过 m 次  
 
        // 使用Greedy 数量词 (贪婪的))(以下3-10个的话,它会先去匹配10,匹配不上依次减少,一匹配上就结束)  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        Pattern p6 = Pattern.compile(".{3,10}[0-9]");  
        String s6 = "aaaa5bbbb68";  
        Matcher m6 = p6.matcher(s6);  
        if (m6.find())  
            p(m6.start() + "-" + m6.end());  
        else 
            p("not match!");  
 
        // 使用 Reluctant 数量词 (不情愿的)(以下3-10个的话,它会先去匹配3,匹配不上依次增加,一匹配上就结束 )  
        Pattern p7 = Pattern.compile(".{3,10}?[0-9]");  
        String s7 = "aaaa5bbbb68";  
        Matcher m7 = p7.matcher(s7);  
        if (m7.find())  
            p(m7.start() + "-" + m7.end());  
        else 
            p("not match!");  
 
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        // 使用 Possessive 数量词(了解即可)  
        // (独占的)(以下3-10个的话,它会先去匹配10,匹配不上就把这十个先删掉再匹配下一个10个,一匹配上就结束)  
        Pattern p8 = Pattern.compile(".{3,10}?[0-9]");  
        String s8 = "aaaa5bbbb68";  
        Matcher m8 = p8.matcher(s8);  
        if (m8.find())  
            p(m8.start() + "-" + m8.end());  
        else 
            p("not match!");  
 
        // non-capturing groups(非捕获)下文.{3}(?=a)表示以a结尾的三个数字(了解即可)  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        Pattern p9 = Pattern.compile(".{3}(?=a)");  
        String s9 = "444a66b";  
        Matcher m9 = p9.matcher(s9);  
        while (m9.find()) {  
            p(m9.group());  
        }  
 
        // back refenrences  
        // 匹配的后的两个组需要一样(了解即可)  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        Pattern p10 = Pattern.compile("(\\d\\d)\\1");  
        String s10 = "1212";  
        Matcher m10 = p10.matcher(s10);  
        p(m10.matches());  
 
        // flags的简写  
        // Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);  
        // 上面的句子简写(了解即可)  
        System.out.println("+++++++++++++++++++++++++++++++++++++");  
        p("Java".matches("(?i)(java)"));  
    }  
 
    public static void p(Object o) {  
        System.out.println(o);  
    }  
 

2、email抓取

import java.io.BufferedReader;  
import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.IOException;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
 
 
public class EmailSpider {  
 
    public static void main(String[] args) {  
        try {  
            BufferedReader br = new BufferedReader(new FileReader("D:\\含邮件地址的.html"));  
            String line = "";  
            while((line=br.readLine()) != null) {  
                parse(line);  
            }  
        } catch (FileNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
 
    private static void parse(String line) {  
        Pattern p = Pattern.compile("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+");  
        Matcher m = p.matcher(line);  
        while(m.find()) {  
            System.out.println(m.group());  
        }  
    }  
 
}
3、代码量统计
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.IOException;  
 
public class CodeCounter {  
      
    static long normalLines = 0;  
    static long commentLines = 0;  
    static long whiteLines = 0;  
      
    public static void main(String[] args) {  
        File f = new File("D:\\src");  
        File[] codeFiles = f.listFiles();  
        for(File child : codeFiles){  
            if(child.getName().matches(".*\\.java$")) {  
                parse(child);  
            }  
        }  
          
        System.out.println("normalLines:" + normalLines);  
        System.out.println("commentLines:" + commentLines);  
        System.out.println("whiteLines:" + whiteLines);  
          
    }  
 
    private static void parse(File f) {  
        BufferedReader br = null;  
        boolean comment = false;  
        try {  
            br = new BufferedReader(new FileReader(f));  
            String line = "";  
            while((line = br.readLine()) != null) {  
                line = line.trim();  
                if(line.matches("^[\\s&&[^\\n]]*$")) {  
                    whiteLines ++;  
                } else if (line.startsWith("/*") && !line.endsWith("*/")) {  
                    commentLines ++;  
                    comment = true;   
                } else if (line.startsWith("/*") && line.endsWith("*/")) {  
                    commentLines ++;  
                } else if (true == comment) {  
                    commentLines ++;  
                    if(line.endsWith("*/")) {  
                        comment = false;  
                    }  
                } else if (line.startsWith("//")) {  
                    commentLines ++;  
                } else {  
                    normalLines ++;  
                }  
            }  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if(br != null) {  
                try {  
                    br.close();  
                    br = null;  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
 


import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class CodeCounter {

static long normalLines = 0;
static long commentLines = 0;
static long whiteLines = 0;

public static void main(String[] args) {
File f = new File("D:\\src");
File[] codeFiles = f.listFiles();
for(File child : codeFiles){
if(child.getName().matches(".*\\.java$")) {
parse(child);
}
}

System.out.println("normalLines:" + normalLines);
System.out.println("commentLines:" + commentLines);
System.out.println("whiteLines:" + whiteLines);

}

private static void parse(File f) {
BufferedReader br = null;
boolean comment = false;
try {
br = new BufferedReader(new FileReader(f));
String line = "";
while((line = br.readLine()) != null) {
line = line.trim();
if(line.matches("^[\\s&&[^\\n]]*$")) {
whiteLines ++;
} else if (line.startsWith("/*") && !line.endsWith("*/")) {
commentLines ++;
comment = true;
} else if (line.startsWith("/*") && line.endsWith("*/")) {
commentLines ++;
} else if (true == comment) {
commentLines ++;
if(line.endsWith("*/")) {
comment = false;
}
} else if (line.startsWith("//")) {
commentLines ++;
} else {
normalLines ++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

}





分享到:
评论

相关推荐

    正则表达式学习笔记

    ### 正则表达式学习笔记 #### 一、正则表达式概述 正则表达式是一种强有力的模式匹配工具,广泛应用于各种编程语言中,用于文本处理。正则表达式允许用户定义复杂的查找模式,这对于数据验证、搜索和替换操作特别...

    正则表达式学习笔记详解!

    ### 正则表达式学习笔记详解 正则表达式(Regular Expression)是一种强大的文本匹配工具,广泛应用于数据处理、文本搜索、格式验证等场景。以下是对给定文件中提到的各种正则表达式的详细解析,旨在帮助读者深入...

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    java正则表达式学习笔记

    ### Java正则表达式基础知识与应用 #### 一、引言 正则表达式是一种强大的文本处理工具,它能够帮助开发者高效地进行字符串的搜索、替换等操作。Java中的正则表达式支持广泛的标准和特性,是进行文本处理任务的理想...

    javascript正则表达式学习笔记

    这篇学习笔记将深入探讨JavaScript正则表达式的概念、语法和实际应用。 一、正则表达式基础 1. 创建正则表达式: - 字面量表示法:`/pattern/flags` - 构造函数:`new RegExp('pattern', 'flags')` 2. 常见的...

    关于js正则表达式学习笔记(自己整理的)

    JavaScript中的正则表达式是处理字符串的强大工具,用于匹配、替换、分割文本。它们在编程中扮演着不可或缺的角色,尤其在验证用户输入、提取数据、格式化内容等方面。以下是对正则表达式的基础知识和常见用法的详细...

    正则表达式 学习笔记 30分钟速成

    好东西才与大家分享!这是博客园一位老师的正则表达式教学笔记,很精炼的阐述,看了你一定不后悔……

    正则表达式学习笔记总结

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和提取字符串中的特定模式。在编程语言中,正则表达式广泛应用于数据验证、文本分析...通过不断的实践和学习,你可以创建更复杂的正则表达式来满足各种需求。

    基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip

    在"基于java的开发源码-多线程反射泛型及正则表达式学习笔记和源码.zip"这个压缩包中,包含了三个关键的Java编程概念:多线程、反射和泛型,以及正则表达式。下面我们将详细探讨这些知识点。 1. **多线程**:多线程...

    [小小明]Python正则表达式全套笔记v0.3(1.8万字干货)

    本文档是小小明个人笔记,为学习和使用正则表达式提供了一个系统的资源。 Python正则表达式全套笔记v0.3 1.1 作者简介 小小明是数据处理专家,擅长解决各种复杂数据处理问题,并且提供了个人笔记,涵盖了正则...

    正则表达式学习笔记小结分享

    学习正则表达式能够帮助我们更好地处理复杂文本需求,如验证输入信息、查找和替换特定模式的文本,以及在大量日志和数据中提取关键信息。 正则表达式的语法结构通常是用斜杠 `/` 包裹模式,并可以加上可选的修饰符...

    java多线程反射泛型及正则表达式学习笔记和源码.zip

    这个压缩包包含的“java多线程反射泛型及正则表达式学习笔记和源码”正是针对这些关键知识点的学习资料。 首先,我们来详细探讨多线程。在Java中,多线程允许程序同时执行多个不同的任务,提高了程序的并发性和效率...

Global site tag (gtag.js) - Google Analytics