正則表示式正反向斷言
非獲取匹配:
首先要了解組group的概念,用()包含的是組,裡面的資料會獲取供以後使用,這叫獲取匹配,通過Match.group(index)獲取,第一個group從1開始,index=0表示獲取整個匹配字串。下面講的都是非獲取匹配。正向表示匹配前面,反向表示匹配後面。
(?=pattern):正向肯定預查,在任何匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜尋,而不是從包含預查的字元之後開始。
(?!pattern):正向否定預查,在任何不匹配pattern的字串開始處匹配查詢字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern): 反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern):反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
用一個例子來看他們的神器支援
把一行字串用千分位隔開,如9999999999用9,999,999,999表示。
看到這個問題是不是首先想到分隔字串來處理了?那樣的話就太low了哦。讓我們用一行程式碼來解決。
System.out.println( "99999999999".replaceAll("(\\d{1,3}(?=(\\d{3})+$))","$1,"));
$表示反向引用,1表示取第一個組的資料。
是不是漲姿勢了...