java正則

純粹爲自己學習記錄

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章