在线测试: http://gskinner.com/RegExr/
变体
单字符转义: 如 . --- \.
块转义: () ---- \Q()\E
不区分大小写 : wuzhong -- (?i)WUZHONG
匹配多个字符之一
十六进制字符 : [a-fA-F0-9] OR [a-fA-F\d] OR (?!)[A-F\d]
非十六进制字符: [^A-Fa-f0-9]
匹配任意字符 : . (不包括换行符)
(?s ). (包括换行符在内的任意字符)
匹配文本行开始或结束
一行的开始和结束 :^alpha$
文本的开始和结束 : \Aalpha\Z
匹配整个单词
\bcat\b my cat is brown acata
匹配多个选择分支之一
\bcat\b|dog \b(aaaa|bbbb|cccc)\b
再次匹配先前匹配的文本
\d\d(\d\d)-\1-\1 >>>> 2008-08-08 2009-09-10
匹配重复次数
固定次数 :
\d{100}
可变次数
\d{1,100}
无限次数重复
\d{1,} === \d+
\d{0,} === \d*
\d{0,1} === \d?
贪婪问题
惰性量词: *?; +? ; ?? ; {1,100}?
非贪婪
<p>.*?</p>
<p>hello<em>world</em></p><p>welcome</p>
贪婪
<p>.*</p>
<p>hello<em>world</em></p><p>welcome</p>
消除不必要的回溯
占有量词 : *+ ; ++ ; ?+ ; {1,100}+
java正则表达式编程
[$”’\n\d/\\] >> [$\”’\n\\d/\\\\]
Pattern regex = Pattern.compile(“[$\”’\n\\d/\\\\]”);
Pattern regex = Pattern.compile(“[$\”’\n\\d/\\\\]”,
Pattern.COMMENTS|Pattern.CASE_INSENSITIVE);
Matcher regexMatcher = regex.matcher(subjectString)
regexMatcher.reset(anotherString)
/**
* 如果检验一个正则表达式是否是部分或整体匹配一个字符串,可以按如下方式
*
* 注: 不要调用String.matches() , Patter.matches() , Matcher.matches(),它们都要求
* 匹配整个字符串,效率不高
*/
@Test
public void test(){
Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("abc1234567ABCDEFG");
System.out.println(matcher.find());
System.out.println(matcher.group());
System.out.println(matcher.start() + ">>>" + matcher.end());
//再次调用,查找下一个匹配
System.out.println(matcher.find());
System.out.println(matcher.group());
System.out.println(matcher.start() + ">>>" + matcher.end());
System.out.println(matcher.replaceFirst("HELLOWROLD"));
//设置匹配字符串的范围
matcher.reset("ab1cda");
matcher.region(1, 100);
System.out.println(matcher.find());
//匹配不到,会抛异常
//System.out.println(matcher.group());
}
匹配多行字符串
-
String lines[] = str.splite(“\r?\n”);
-
遍历每行进行匹配