純粹爲自己學習記錄
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