`
whp0731
  • 浏览: 171053 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

regular expression(正则表达式)学习笔记

阅读更多

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();
				}
			}
		}
	}

}

 

 

分享到:
评论

相关推荐

    一个基于C#实现的Regular Expression正则表达式验证工具程序代码

    一个基于C#实现的Regular Expression正则表达式验证工具程序代码。

    Regular_Expression正则表达式手册.zip

    Regular_Expression正则表达式手册.zipRegular_Expression正则表达式手册.zipRegular_Expression正则表达式手册.zipRegular_Expression正则表达式手册.zip

    正则表达式 Regular Expression 正则表达式资料大全压缩包

    正则表达式资料大全压缩包大全 资料应有尽有 QQ:464344269 如果你下了 没有你想要的资料 请 杀了我

    常用java正则表达式

    如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。 许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理...

    Regular Expression正则表达式全攻略

    正则表达式全攻略 全面解析正则表达式

    正则表达式语法详解正则表达式语法详解

    正则表达式语法详解 正则表达式语法详解 正则表达式语法详解 正则表达式语法详解 正则表达式语法详解

    正则表达式(regular expression)参考教程

    正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。

    通用 正则表达式 详解

    正则表达式 详解 基础 正则表达式之道(A Tao of Regular Expressions)

    csharp正则表达式参考手册

    (英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。...

    使用正则表达式的模式匹配

    正则表达式(regular expression)是一个描述字符模式的对象。JavaScript的RegExp类表示正则表达式,而String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。 ECMAScript v3对JavaScript...

    正则表达式(regular expression)

    正则表达式(regular expression)  原著:笑容  创作于:2004年05月03日 最后更新:2004年05月04日 21:12 引用地址:正则表达式(regular expression) 版权声明:使用创作公用版权协议 ...

    ASP.NET 中的正则表达式

    本文介绍了深入学习正则表达式的基础知识和推荐内容。 本文主要面向对正则表达式知之甚少或没有使用经验,但却熟悉 ASP.NET、可借助 .NET 编程的初学者。此外,希望本文连同 regular expression cheat sheet 成为有...

    正则表达式(regular expression)手册(CHM)

    正则表达式(regular expression)手册(CHM) 要学习正则表达式的朋友可以看看啊 很好用的手册哦。

    正则表达式支持库2.0#0版(静态版)

    易语言RegEx_static.lib支持库中文名为易语言正则表达式支持库,本易语言支持库实现了对正则表达式(Regular Expression)的支持。注意,本支持库中的所有命令均为高级命令,要求使用者具有一定的正则表达式知识基础...

    正则表达式之道

    (英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。...

    正则表达式之道.pdf

    (英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作...

    正则表达式基础 Regular Expression

    正则表达式简介  为什么需要正则表达式?  文本的复杂处理。  正则表达式的优势和用途?  一种强大而灵活的文本处理工具;  提供了一种紧凑的、动态的方式,能够以一种完全通用的方式来解决各种字符串...

    正则表达式(regular expression)手册

    正则表达式(regular expression)手册

    45 - Nginx中的正则表达式.mp4

    (英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。...

    正则表达式验证工具源码

    正则表达式验证工具源码 源码的简单描述: ...正则表达式验证工具,通过System.Text.RegularExpressions里边的Regex类的方法对输入的正则表达式与填写的字符串进行验证,界面干净简洁,功能实用,代码简单易懂。

Global site tag (gtag.js) - Google Analytics