package com.songguoliang.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 正则表达式知识
* @date 2016-04-15 10:14:48
* @author sgl
*/
public class Demo01 {
/**
* 正则表达式基础
* @date 2016-04-15 10:23:56
* @author sgl
*/
public static void regexBase(){
// .表示除换行符以外的任意字符
System.out.println("a".matches("."));//输出true
System.out.println("1".matches("."));//输出true
System.out.println(" ".matches("."));//输出true
System.out.println("\t".matches("."));//输出true
System.out.println("abc".matches(".bc"));//输出true
// \d匹配数字[0-9] digit单词的首字符,小写表示是,大写表示非
System.out.println("1".matches("\\d"));//输出true
System.out.println("a".matches("\\d"));//输出false
// \D匹配非数字[^0-9]
System.out.println("1".matches("\\D"));//输出false
System.out.println("a".matches("\\D"));//输出true
// \s匹配空白字符[ \t\n\x0B\f\r] space单词的首字符,小写表示是,大写表示非
System.out.println(" ".matches("\\s"));//输出true
System.out.println("\t".matches("\\s"));//输出true
System.out.println("\n".matches("\\s"));//输出true
System.out.println("a".matches("\\s"));//输出false
// \S匹配非空白字符[^\s]
System.out.println("------");
System.out.println(" ".matches("\\S"));//输出false
System.out.println("\t".matches("\\S"));//输出false
System.out.println("\n".matches("\\S"));//输出false
System.out.println("a".matches("\\S"));//输出true
// \w匹配单词字符[a-zA-Z_0-9] word单词的首字符,小写表示是,大写表示非
System.out.println("------");
System.out.println(" ".matches("\\w"));//输出false
System.out.println("a".matches("\\w"));//输出true
System.out.println("1".matches("\\w"));//输出true
System.out.println("A".matches("\\w"));//输出true
System.out.println("\t".matches("\\w"));//输出false
// ^匹配行的开头
//匹配以a开头的字符串
System.out.println("abc".matches("^a.*"));//输出true
System.out.println("abc".matches("^b.*"));//输出false
// $匹配行的开头
//匹配以a结尾的字符串
System.out.println("bca".matches(".*a$"));//输出true
System.out.println("bca".matches(".*b$"));//输出false
// *匹配前面的子表达式零次或多次
System.out.println("bca".matches(".*"));//输出true
System.out.println("bca".matches("b.*"));//输出true
System.out.println("bca".matches("d*bca"));//输出true
// +匹配前面的子表达式一次或多次
System.out.println("bca".matches(".+ca"));//输出true
System.out.println("bca".matches("b.+"));//输出true
System.out.println("bca".matches("d+bca"));//输出false
// ?匹配前面的子表达式零次或一次
System.out.println("aab".matches("a?aab"));//输出true
System.out.println("aab".matches("a?ab"));//输出true
System.out.println("aab".matches("a?b"));//输出false
// {n}匹配前面的子表达式确定的 n次,n是一个非负整数。
System.out.println("aab".matches("a{2}b"));//输出true
System.out.println("aab".matches("a{1}ab"));//输出true
System.out.println("aab".matches("a{1}b"));//输出false
// {n,}匹配前面的子表达式至少n次,n是一个非负整数。
System.out.println("aab".matches("a{2,}b"));//输出true
System.out.println("aab".matches("a{1,}ab"));//输出true
System.out.println("aab".matches("a{1,}b"));//输出true
System.out.println("aaaaaab".matches("a{1,}b"));//输出true
// {n,m}匹配前面的子表达式至少n次且最多m次,n和m都是非负整数,其中n <= m
System.out.println("aab".matches("a{1,2}b"));//输出true
System.out.println("aab".matches("a{1,2}ab"));//输出true
System.out.println("aaab".matches("a{1,2}b"));//输出false
System.out.println("aaaaaab".matches("a{1,2}b"));//输出false
// | 或者,如:x|y匹配x或者y
System.out.println("a".matches("a|b"));//输出true
System.out.println("b".matches("a|b"));//输出true
System.out.println("c".matches("a|b"));//输出false
// []字符集合,匹配所包含的任意一个字符,如[xyz]匹配x或y或z
System.out.println("a".matches("[abc]"));//输出true
System.out.println("b".matches("[abc]"));//输出true
System.out.println("c".matches("[abc]"));//输出true
System.out.println("d".matches("[abc]"));//输出false
// [^]非字符集合,匹配未包含的任意字符,如[xyz]匹配不是x并且不是y并且不是z的字符
System.out.println("a".matches("[^abc]"));//输出false
System.out.println("b".matches("[^abc]"));//输出false
System.out.println("c".matches("[^abc]"));//输出false
System.out.println("d".matches("[^abc]"));//输出true
// [a-z]字符范围,匹配指定范围内的任意字符
System.out.println("a".matches("[a-c]"));//输出true
System.out.println("b".matches("[a-c]"));//输出true
System.out.println("c".matches("[a-c]"));//输出true
System.out.println("d".matches("[a-c]"));//输出false
// [^a-z]非字符范围,匹配任何不在指定范围内的任意字符
System.out.println("a".matches("[^a-c]"));//输出false
System.out.println("b".matches("[^a-c]"));//输出false
System.out.println("c".matches("[^a-c]"));//输出false
System.out.println("d".matches("[^a-c]"));//输出true
// \b匹配单词边界,也就是指单词和空格间的位置。 boundary单词的首字符,小写表示是,大写表示非
System.out.println("name".matches(".*me\\b"));//输出true
System.out.println("mean".matches(".*me\\b"));//输出false
// \B匹配非单词边界,也就是指不匹配单词和空格间的位置。
System.out.println("name".matches(".*me\\B.*"));//输出false
System.out.println("mean".matches(".*me\\B.*"));//输出true
}
/**
* 贪婪模式、非贪婪模式
* @date 2016-04-20 14:29:52
* @author sgl
*/
public static void greedMode(){
//提取td元素里的内容
String str="<table><tr><td>hello world</td><td>hello regex</td></tr></table>";
//贪婪模式 * + {n,} 默认情况是贪婪模式匹配
System.out.println("====贪婪模式=====");
//编译正则表达式到模式对象
Pattern p=Pattern.compile("<td>.*</td>");
//得到匹配器
Matcher m=p.matcher(str);
//通过find方法查找匹配,找到就返回true,否则返回false
while(m.find()){
//通过group方法获取前面find查找到的子字符串,start、end方法获取子字符串开始和结束位置
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
//非贪婪模式,?跟在 * + {n,} 等的后面时,表示非贪婪模式,注意和子表达式后面的?区分开,子表达式后的?表示匹配0次或1次
System.out.println("====非贪婪模式=====");
p=Pattern.compile("<td>.*?</td>");
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
}
/**
* 匹配时忽略大小写
* @date 2016-04-20 14:49:09
* @author sgl
*/
public static void caseInsensitive(){
String str="Hello world,hello java";
System.out.println("===========区分大小写===========");
Pattern p=Pattern.compile("hello");
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("===========不区分大小写===========");
p=Pattern.compile("hello",Pattern.CASE_INSENSITIVE);
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
}
/**
* 匹配单词边界
* @date 2016-04-20 15:00:01
* @author sgl
*/
public static void wordBoundary(){
String str="the cat scattere