整理正则表达式
2011-08-03 10:18
316 查看
引言:基本不怎么使用正则表达式,以至于每次使用时都忘记各符号含义及用法,所以记录下,供快速参考用。
做个练习:某网页另存为保存到本地磁盘后,抠出里面所有的Email
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void p(Object o){ System.out.println(o); } public static void main(String[] args) { /** * 简单认识正则表达式 */ p("abc".matches("...")); p("a8729a".replaceAll("\\d", "-")); Pattern p = Pattern.compile("[a-z]{3}");//创建一个编辑好的模式 Matcher m = p.matcher("fgh");//用模式匹配去字符串,匹配后的结果保存在匹配器里 p(m.matches());//true p("fgh".matches("[a-z]{3}"));//更方便写法,用字符串的matches()方法直接去匹配正则.由于使用时临时编译,所以速度慢 /** * 认识. * + ? * * .代表一个任意字符 * *代表0个或多个字符 * +代表1个或多个字符 * ?代表0个或1个字符 */ p("a".matches("."));//true p("aa".matches("aa"));//true p("aaaa".matches("a*"));//true p("aaaa".matches("a+"));//true p("".matches("a*"));//true p("aaaa".matches("a?"));//false p("".matches("a?"));//true p("a".matches("a?"));//true p("4354654545".matches("\\d{3,100}"));//true p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));//false p("192".matches("[0-2][0-9][0-9]"));//true /** * 范围 * * []用来匹配一个字符 * ^放[]里代表取反,放[]外代表以某字符开头 */ p("a".matches("[abc]"));//true p("a".matches("[^abc]"));//false p("A".matches("[a-zA-Z]"));//true p("A".matches("[a-z]|[A-Z]"));//true p("A".matches("[a-z[A-Z]]"));//true p("R".matches("[A-Z&&[RFG]]"));//true /** * 认识\s \w \d \ * * \s代表任意空白字符 * \w代表任意英文符号 包括数字、字母、下划线 * \d代表任意数字 */ p(" \n\r\t".matches("\\s{4}"));//true p(" ".matches("\\S"));//false p("a_8".matches("\\w{3}"));//true p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));//true p("\\".matches("\\\\"));//true /** * 边界^ $ \b * * ^在[]外代表以某字符串开头 * $代表以某字符串结尾 * \b代表单词边界 */ p("hello sir".matches("^h.*"));//true p("hello sir".matches(".*ir{1}quot;));//true p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//true p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));//false //whilte lines p(" \n".matches("^[\\s&&[^\\n]]*\\n{1}quot;));//true 0个或多个"空白字符并且非换行符"开头,换行符结束 p("aaa 8888c".matches(".*\\d{4}."));//true p("aaa 8888c".matches(".*\\b\\d{4}."));//true p("aaa8888c".matches(".*\\d{4}."));//true p("aaa8888c".matches(".*\\b\\d{4}."));//false //Email p("java_ztx@126.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+")); /** * matches find lookingAt * find依次往下查找是否匹配 * lookingAt每次都从头查找是否匹配 */ Pattern p = Pattern.compile("\\d{3,5}"); String s = "123-34345-234-00"; Matcher m = p.matcher(s); p(m.matches()); m.reset(); p(m.find());//true p(m.start()+"-"+m.end()); p(m.find());//true p(m.start()+"-"+m.end()); p(m.find());//true p(m.start()+"-"+m.end()); p(m.find());//false //p(m.start()+"-"+m.end()); p(m.lookingAt());//true p(m.lookingAt());//true p(m.lookingAt());//true p(m.lookingAt());//true /** * 替换 */ Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE); Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afdafgeerdg"); p(m.replaceAll("JAVA")); m.reset(); StringBuffer sb = new StringBuffer(); int i = 0;//奇、偶控制 while (m.find()) { i++; if(i%2 == 0){//偶 m.appendReplacement(sb,"java"); } else {//奇 m.appendReplacement(sb, "JAVA"); } } m.appendTail(sb);//添加尾巴 p(sb);//JAVA java JAVA java IloveJAVA you hatejava afdafgeerdg /** * 组 * 一个()代表一个组 * 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.group(1));//打印匹配的123aa字符串里的第一组,即123 } } }
做个练习:某网页另存为保存到本地磁盘后,抠出里面所有的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:\\test.html")); String line = ""; while ((line = br.readLine()) != null) { parse(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } } public 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()); } } }