往往有很多需求,需要取出指定字符之間的字符串,取的方式有多種,關系到重復使用的問題,如abc123abc456abc,如果使用正則取出abc之間的內容,這里可能有兩種結果,
結果1: 123 456
結果2: 123
為什么有兩種結果呢
這里的一個區別就是,abc能否重復使用的問題,結果1就是abc重復使用了,而結果2中取法,abc不可重復使用
下面代碼取出abc之間的內容
public static void main(String[] args) {
/Pattern p = Pattern.compile("\@(.*?)\:");//正則表達式,取=和|之間的字符串,不包括=和|
String filetext = "abc張小名abc 25分abc李小花abc 43分abc王力abc 100分abc";
Pattern p = Pattern.compile("abc(.*?)abc");
Matcher m = p.matcher(filetext);
while(m.find()) {
System.out.println(m.group());//m.group(1)不包括這兩個字符
}
結果為:
張小名
李小花
王力
很明顯,上面的正則取法是不可重復的匹配法,每次匹配后,abc不可下次使用
我們在改下代碼
public static void main(String[] args) {
String filetext = "abc張小名abc 25分abc李小花abc 43分abc王力abc 100分abc";
//Pattern p = Pattern.compile("abc(.*?)abc");//正則表達式 會消耗字符串abc
Pattern p = Pattern.compile("(?<=abc)(.*?)(?=abc)");//不消耗字符串abc
Matcher m = p.matcher(filetext);
while(m.find()) {
System.out.println(m.group(1));//m.group(1)不包括這兩個字符
}
}
運行結果:
這里我們可以看到,這種正則匹配是可以重復使用abc的,也就是指針沒有下移,把abc之間的內容都娶到了
以上是兩種正則的區別,需要根據實際場景來使用
關于正則表達式引擎,可以參考下圖來學習
(?:pattern) 與 (?=pattern)也有一些區別,主要在于消耗字符、是否輸出匹配結果方面,如下圖已經說得很清楚了