1. 程式人生 > >java正則表示式中的分組

java正則表示式中的分組

之前瞭解的regex中的()只是方便和?+ * |這類的符號的匹配以達到劃分範圍的目的。
比如說這個:"([+]|-)"
這個表示式匹配的是+-,而不是[+後跟著]-
如果是第二種意思得這麼寫"(\[+(])|-)"
這個例子很容易的就說明了[]中的意思和沒有括號是不同的,以及括號的意思是用來劃分範圍,即分組

今天瞭解到這個括號還有一個其他的用途就是捕獲。捕獲就是為了解決"越來越牛逼"這種 ABAC型問題。

Pattern pattern=  Pattern.compile("(\\w).+\\1.+");

寫法很簡單\w的意思是[a-zA-Z0-9]
()代表了分組這裡的\w第一個出現所以放在了第一組中
.+的意思匹配多個非/n的字元
\\1的意思是重複出現匹配第一組匹配成功後的資訊
看懂了這些也就自然能理解為什麼能匹配越來越牛逼了

分組有時候也會因相互巢狀而變得複雜起來,比如我想要表示信用卡的餘額:
金額是有正有負的整數或小數,金額為正可以省略正號,甚至只寫小數點後面兩位也可以識別,於是就有了下面的正則表示式

"(([+]|-)?\\d+(.\\d{1,2})?)|(.\\d{1,2})"

“+12”;//成功
“-123”;//成功
“12.3”;//成功
" .12";//成功

“.”;//失敗
“123.”;//失敗
.123";//失敗
“+.12”//失敗

這個式子中的括號就看著比剛才的難多了,因為這時候出現了巢狀,那麼這時候該怎麼分組呢?
其實很簡單
在這裡插入圖片描述
分別對1234號括號的內容進行捕獲儲存到了1234四個組中,不過這有引出了一個新的問題,有時候我只想用括號分個組並不需要捕獲啊,這時候就引出了一個新的元字元(?: ··· )

這時候()就代表著只分組不捕獲的意思了。注意不要跟?搞混了