http://www.cjsdn.net/Doc/JDK50/java/util/regex/Pattern.html
package test.regularExp;
import java.util.regex.Matcher;import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) { // ==== 简单认识正则表达式的概念 ==== /*p("abc".matches("...")); p("a13123b".replaceAll("\\d", "-")); // \d表示 一个数字 Pattern p = Pattern.compile("[a-z]{3}"); Matcher m = p.matcher("fgh"); p(m.matches()); p("fghj".matches("[a-z]{3}"));*/ // ==== 初步认识 . * + ? ==== /* * Greedy 数量词 X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次 */ /*p("a".matches(".")); // .表示 任意一个字符 p("aa".matches("aa")); p("aaaa".matches("a*")); // *表示 0个多个或 p("aaaa".matches("a+")); // +表示 1个或多个 p("aaaa".matches("a?")); // ?表示 0个或1个 p("".matches("a?")); p("236152352345".matches("\\d{3,100}")); // {3,100}表示 长度是3到100 p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\{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](减去) */ /*p("a".matches("[abc]")); p("a".matches("[^abc]")); // ^表示 除了abc之外的字符 p("a".matches("[a-zA-Z]")); p("a".matches("[a-z]|[A-Z]")); // a-z OR A-Z p("a".matches("[a-z[A-Z]]")); // a-z OR A-Z p("a".matches("[A-Z&&[RFG]]")); // A-Z AND 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] */ /*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("\\\\"));*/ // ==== POSIX Style ==== /* * POSIX 字符类(仅 US-ASCII) \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] */ //p("a".matches("\\p{Lower}")); // ==== boundary ==== /* * 边界匹配器 ^ 行的开头 $ 行的结尾 \b 单词边界 \B 非单词边界 \A 输入的开头 \G 上一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符(如果有的话) \z 输入的结尾 */ /*p("hello sir".matches("^h.*")); p("hello sir".matches(".*r$")); p("hello sir".matches("^h[a-z]{1,3}o\\b.*")); p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));*/ // ==== white lines ==== //p(" \n".matches("^[\\s&&[^\\n]]*\\n$")); // ==== practise ==== /*p("aaa 8888c".matches(".*\\d{4}.")); p("aaa 8888c".matches(".*\\b\\d{4}.")); p("aaa8888c".matches(".*\\d{4}.")); p("aaa8888c".matches(".*\\b\\d{4}."));*/ // ==== email ==== //p("adsfasdfasdf@afdads.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+")); // ==== matches find lookingAt start&end ==== /*Pattern p = Pattern.compile("\\d{3,5}"); String s = "123-34343-234-00"; Matcher m = p.matcher(s); p(m.matches()); m.reset(); p(m.find()); p(m.start() + "-" + m.end()); p(m.find()); p(m.start() + "-" + m.end()); p(m.find()); p(m.start() + "-" + m.end()); p(m.find()); p(m.start() + "-" + m.end()); p(m.lookingAt()); p(m.lookingAt()); p(m.lookingAt()); p(m.lookingAt());*/ // ==== string replacement ==== /*Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("java JAVa JAVA jaVa IlovejAVA youhateJaVa"); //p(m.replaceAll("JAVA")); StringBuffer buf = new StringBuffer(); int i=0; while(m.find()) { i++; if (i%2 == 0) { m.appendReplacement(buf, "java"); } else { m.appendReplacement(buf, "JAVA"); } } m.appendTail(buf); p(buf); */ // ==== group ==== /*Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})"); String s = "123aa-34345bb-234cc-00"; Matcher m = p.matcher(s); while(m.find()) { //p(m.find()); p(m.group()); //p(m.group(1)); //p(m.group(2)); }*/ // ==== qulifiers ==== /* * 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 次 */ /*Pattern p = Pattern.compile(".{3,10}[0-9]"); //Pattern p = Pattern.compile(".{3,10}?[0-9]"); //Pattern p = Pattern.compile(".{3,10}+[0-9]"); String s = "aaaa5bbbb6"; Matcher m = p.matcher(s); if (m.find()) { p(m.start() + "-" + m.end()); } else { p("not match!"); }*/ // ==== non-capturing groups ==== Pattern p = Pattern.compile(".{3}(?=a)"); //Pattern p = Pattern.compile(".{3}(?!a)"); //Pattern p = Pattern.compile("(?=a).{3}"); //Pattern p = Pattern.compile(".{3}(?<=a)"); String s = "444a66b"; Matcher m = p.matcher(s); while (m.find()) { p(m.group()); } } public static void p(Object o) { System.out.println(o); }}
// ===== 抓取网页中的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:\\1.txt")); String line = ""; while((line=br.readLine()) != null) { parse(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { 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()); } }
}
// ==== 代码统计程序 ====
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:\\code\\src\\"); File[] codeFiles = f.listFiles(); for (File child : codeFiles) { if (child.getName().matches(".*\\.java$")) { parse(child); } } }
private static void parse(File f) { BufferedReader br = null; try { br = new BufferedReader(new FileReader(f)); String line = ""; while((line = br.readLine()) != null) { if ((line.matches("^[\\s&&[^\\n]]*\\n$"))) { whiteLines++; } else { } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); br = null; } catch (IOException e) { e.printStackTrace(); } } } }
}
