java正则

来源:互联网 发布:华为和星环大数据 编辑:程序博客网 时间:2024/06/05 10:47

纯粹为自己学习记录

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


原创粉丝点击