捕获分组和非捕获分组以及命名分组

正则表达式实战

 

下面由一个例子引出非捕获组。

有两个金额:8899¥。显然,前一个是8899元的人民币,后一个是6688元的美元。我现在需要一个正则,要求提炼出它们的货币金额和货币种类。正则可以这写:(\\d)+([¥$])$  (在Java中测试,所以多了转义字符'\'),最后一个$是字符串结束
测试程序如下:

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("(\\d+)([¥$])$");//
        String str = "8899¥";
        Matcher m = p.matcher(str);
        if (m.matches())
        {
            System.out.println("货币金额: " + m.group(1));
            System.out.println("货币种类: " + m.group(2));
        }

    }

}

输出结果为:

货币金额: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值