捕获分组和非捕获分组以及命名分组
?
下面由一個例子引出非捕獲組。
有兩個金額:8899¥。顯然,前一個是8899元的人民幣,后一個是6688元的美元。我現在需要一個正則,要求提煉出它們的貨幣金額和貨幣種類。正則可以這寫:(\\d)+([¥$])$? (在Java中測試,所以多了轉義字符'\'),最后一個$是字符串結束
測試程序如下:
輸出結果為:
貨幣金額: 8899
貨幣種類: ¥
OK,滿足了要求。這里的正則分成了兩個組,一個是(\\d+),一個是([¥$]),前一個組匹配貨幣金額,后一個組匹配貨幣種類。
現在,我需要這個正則可以匹配浮點數。如8899.56¥。我們都知道,現在少于一元錢基本上買不到東西了,所以我希望忽略小數部分,正則還是提煉出 8899 和 ¥。
那么正則如下:
(\\d+)(\\.?)(\\d+)([¥$])$
這里用括號分了四組,所以要輸出貨幣金額的整數部分和貨幣種類,要分別輸了group(1),group(4)了。如果輸出部分和正則是分開的,我希望只修改正則而不去修改輸出部分的代碼,也就是還是用group(1),group(2)作為輸出。由此可以引出非捕獲組(?:)。
把前面的正則修改為:
(\\d+)(?:\\.?)(?:\\d+)([¥$])$
這樣,還是用group(1),group(2)做為輸出,同樣輸出了 8899 和 ¥
這個正則的中間兩個組用到的就是非捕獲組(?:),它可以理解為只分組而不捕獲。
?
當然也可以用命名分組,這樣直觀一點.
package test;import java.util.regex.Matcher; import java.util.regex.Pattern;public class main {public static void main(String[] args){Pattern p = Pattern.compile("(?<money>\\d+)(?:\\.?)(?:\\d+)(?<type>[¥$])$");// String str = "8899.56¥";Matcher m = p.matcher(str);if (m.matches()){System.out.println("貨幣金額: " + m.group("money"));System.out.println("貨幣種類: " + m.group("type"));}}}?
轉載于:https://www.cnblogs.com/ptqueen/p/7020828.html
總結
以上是生活随笔為你收集整理的捕获分组和非捕获分组以及命名分组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop分布式文件系统--HDFS结
- 下一篇: NYOJ 927 The partial