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();
}
}
}
}
}
分享到:
相关推荐
JavaScript中的正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换以及提取字符串中的模式。在Web开发中,它被广泛应用于数据验证、文本搜索和替换等场景。这篇学习笔记将深入探讨...
### 正则表达式学习笔记详解 正则表达式(Regular Expression)是一种强大的文本匹配工具,广泛应用于数据处理、文本搜索、格式验证等场景。以下是对给定文件中提到的各种正则表达式的详细解析,旨在帮助读者深入...
正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一种简洁而强大的语法来定义一系列字符或字符组合,帮助程序员快速准确地定位和...
在"C#字符串和正则表达式学习笔记.doc"这份文档中,你可能还会学到如何使用正则表达式进行高级匹配,例如使用捕获组和非捕获组,以及使用反向引用来引用先前匹配的子串。同时,可能会涉及到正则表达式的性能优化技巧...
正则表达式(Regular Expression)是一种在计算机科学领域广泛使用的模式匹配工具。它主要用于处理文本数据,包括搜索、替换以及提取文本中的特定模式。许多编程语言,包括Python,都支持正则表达式的使用。Python中...
正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。在这个“正则表达式”学习笔记中,我们将深入探讨这一强大的工具。 1. **基础概念** ...
这个压缩包“python正则表达式学习.zip”包含了对Python正则表达式的学习笔记,下面我们将深入探讨这一主题。 首先,我们需要了解什么是正则表达式。正则表达式(Regular Expression,简称regex)是一种特殊的字符...
**正则表达式**(Regular Expression)是一种强大的文本处理工具,主要用于字符串的匹配、搜索、替换等操作。通过一系列特定的字符和元字符的组合,正则表达式能够帮助我们高效地处理各种复杂的文本数据。 #### 二...
正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索替换等场景。在IT行业中,熟练掌握正则表达式是提高工作效率的关键技能之一。 首先,我们来看看...
正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索和替换等场景。以下是对标题“正则表达式例子及笔记”和描述中的知识点进行的详细解释。 一、正则...
正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助我们实现字符串的搜索、替换等操作。它由一系列用于匹配字符串中字符组合的特殊符号组成。 #### 二、基本符号与用法 在学习正则表达式时,...
正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换字符串中的模式。在Python中,通过`re`模块来实现正则表达式操作。 #### 3.2 正则表达式实例 例如,我们可以使用`re.match()`或`...
正则表达式学习笔记 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含 有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 列目录时, dir *.txt或...
首先,正则表达式(Regular Expression)是一组符合特定规则的字符序列,主要用于字符串的查找、匹配、替换等操作。它们的特点在于使用特殊符号来简化字符串处理的代码,使代码更简洁,但也可能导致可读性降低,特别...
正则表达式(Regular Expression,简称Regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。RegExr是一款强大的正则表达式测试和学习工具,它提供了实时检测和保存的功能,帮助...
在Java中,正则表达式(Regular Expression)通过java.util.regex包来支持,提供了Pattern、Matcher和Pattern类等核心类来实现。下面将详细探讨Java中正则表达式的使用方法、语法以及常见应用。 1. **正则表达式...
正则表达式(Regular Expression)是编程领域中用于匹配字符串的强大工具,广泛应用于前端和后端开发中。它由各种字符、元字符和操作符组成,可以用来验证输入数据的有效性,提取信息,或者进行文本替换等操作。在...
正则表达式(Regular Expression)是一种强大的文本处理工具,它能用来匹配、查找、替换等操作符合特定模式的字符串。在.NET中,`System.Text.RegularExpressions`命名空间提供了`Regex`类来支持正则表达式的操作。 ...