第一段为合法html代码,第二段为不合法html代码。
[^<]+ 匹配非<的任意多个字符
 
\\w+[^<]+</\\w+> ;
 
开头用来匹配开始tag
结尾用来匹配结束tag
中间用来匹配文本。
发现这个正则表达式,既能匹配合法,又能匹配不合法的。
因为匹配开始tag和结束tag的两个子表达式,并没有什么联系,也就是说匹配的结束tag并不等于开始的tag
下面用反向引用在两个子表示之间建立联系:
String regex =  "<(\\w+)>[^<]+</(\\1)>" ;
运行结果:
<h1>good,good</h1>能够匹配正则:<(\w+)>[^<]+</(\1)>
<h1>bad</h2>不能够匹配正则:<(\w+)>[^<]+</(\1)>
对匹配开始tag的子表达式添加捕获分组:
<(\\w+)
 
在匹配结束tag的子表达式中,使用\1这个反向引用的功能:
</(\\1)> 引用之前的子表达式: ( \\w +)
补充:
一些题外话;使用正则表达式替换的时候,也可以使用反向引用的功能。
例子:
public   class  GeneralEvelent {
public   static   void  main(String[] args) {
String dupWords =  "word word" ;
String dupWordRegex =  "(\\w+)\\s+(\\1)" ;
System. out .println( "替换之前:" +dupWords);
System. out .println( "替换之后:"
+dupWords.replaceAll(dupWordRegex,  "$1" ));
}
}
运行结果:
替换之前:word word
替换之后:word
简单的去掉重复单词的例子
 
dupWords.replaceAll(dupWordRegex,  "$1" )
 
$1按照java语言规定,这个特殊变量对应的是正则表达式中编号为1的分组所捕获的字符串。
也就是说将两个重复单词的字符串,替换为单个重复单词的字符串,这样就去掉了一个重复单词。
小结
·量词:规定之前元素出现的次数
·*+,?
·区间量词:{min,max}
·量词的局限:括号(...)的使用
·括号的用途:多选分支
·括号的用途:捕获分组
·括号的用途:反向引用
 
正则表达式 学习笔记3 完!