纯粹为自己学习记录
1、贪婪和非贪婪--在于有没有加"?"
"?"用于表示数量的时候相当于{0,1}。既然他最多只能匹配一个,那当然是非贪婪的。
注意比较(.*)和(.*?)
例子:想要匹配出所有的<a href="...."> </a> 并且领用java.util.regx包只输入链接的标签。不要输入链接内容。
输入值为:<html><head></head><body><span><a href=\"第一个链接\">第一个链接</a></span><a href=\"第二个链接\">第二个链接</a><div><a href=\"第三个链接\">保留第三个链接</a></div><div><a href=\"第四个链接\">保留第四个链接</a></div><div><a href=\"第五个链接\">保留第五个链接</a ss></div></body></html>";
注意:输入值的最后一个<a>的结束标签为</a ss>
正则表达式一:(<a\\s*[^>]*>).*?(</a[^>]*>)---------------------非贪婪模式。
运行结果:
<a href="第一个链接">
</a>
<a href="第二个链接">
</a>
<a href="第三个链接">
</a>
<a href="第四个链接">
</a>
<a href="第五个链接">
</a ss>
bingo!!!!! 运行成功,输出了所有的标签。
正则表达式二:(<a\\s*[^>]*>).*(</a[^>]*>)---------------------------贪婪模式。(有没有发现少了一个"?")
运行结果:
<a href="第一个链接">
</a ss>
no!!!!!!!!!! 不是我们想要的。现在知道了吧,我为什么要把最后一个标签的结束标签写成</a ss>。如果写成</a>就看不出问题,还以为每次都是取得第一个标签,造成错误的理解。
非贪婪模式每次匹配都是以能满足匹配最低要求为标准,所以每while循环一次就只匹配一个<a></a>。循环结束后就把所有<a></a>都匹配出来。
贪婪模式刚好相反,以能满足匹配最大要求为标准。所以第一次匹配的时候就把头跟尾给匹配出来了。
2、利用^和$向一个文件的每一行的行首或者行尾增加信息。
因为^和$只匹配位置而不匹配字符,所以^代表匹配行的行首,$代表匹配行的行尾。加上JAVA 正则的多行的匹配和Matcher的replaceAll()来实现向文件每一行的行首或者行尾增加信息的功能。
具体例子如下:
String reg="^";
String input = "第一条\n第二条";
Pattern pattern = Pattern.compile(reg,Pattern.MULTILINE);
Matcher matcher = pattern.matcher(input);
System.out.print(matcher.replaceAll("增加的信息、"));
运行结果:
增加的信息、第一条
增加的信息、第二条
分享一个很棒的正则学习网站http://www.regular-expressions.info/engine.html