软件构造(三)

软件构造实验遇到的问题

在进行学校的软件构造实验时,我遇到了一些问题,故以此方式记录下来,希望以后自己有能力解决。

正则表达式的使用

在使用正则表达式进行字符串匹配时,我希望在匹配成功之后用group()函数将我需要的字段给分别提取出来,结果却遇到了我无法解决的问题。
我需要匹配的字符串类似于a3|b4|r7c5|r9|n0|t4|m9m9这种有着数字和字母以及|,并且前半部分的长度还是不确定。为了匹配这个字符串,我写出的正则表达式为([a-z][0-9]\|)*[a-z][0-9],显然是能做到对这类字符串进行精准匹配。但是为了能够在匹配成功之后还能从中轻松地提取到我需要的信息,如a3|b4|r7我需要提取到a和3,b和4,r和7,于是我便照着教程给正则表达式加括号,结果为(([a-z])([0-9])\|)*([a-z])([0-9]),然而当我用group()提取字段时的结果却并不理想。

String reg="a1|c2|e3|f4|r5|t6";
        Pattern p=Pattern.compile("(([a-z])([0-9])\\|)*([a-z])([0-9])");
        Matcher m=p.matcher(reg);
        if(m.matches()){
            for(int i=0;i<=m.groupCount();i++){
                System.out.println(m.group(i));
            }
        }

在这里插入图片描述
可以看见对于字符串a1|c2|e3|f4|r5|t6的分组结果中并未如愿得到a和1,c和2,e和3,f和4,反而还多出了一个不要的r5|。经过观察发现,对于(([a-z])([0-9])\|)*所匹配的部分似乎无法按照我所预期的那样将所有的字母和数字逐个通过m.group()得到,应该是只能够得到最后一部分的字母和数字,也就是r和5。而且本来不是为了分组而是为了符合语法才添加的括号,如(...)*也被算在了分组当中。
于是我又去网上搜索有没有更好的办法,找了半天也只找到了一个形如((...)*)的操作,能够将前面所有匹配的字符串,即a1|c2|e3|f4|r5|都打印出来,但这还是没能很好地解决我的问题,于是我就自己用find()函数写了下面这个方法,从而解决了问题。

String reg="a1|c2|e3|f4|r5|t6";
        Pattern p=Pattern.compile("(([a-z])([0-9])\\|)*([a-z])([0-9])");
        Matcher m=p.matcher(reg);
        if(m.matches()){
            Pattern a=Pattern.compile("[a-z]");
            Pattern b=Pattern.compile("[0-9]");
            Matcher n=a.matcher(reg);
            m=b.matcher(reg);
            while(n.find()){
                System.out.println(reg.substring(n.start(),n.end()));
            }
            while(m.find()){
                System.out.println(reg.substring(m.start(),m.end()));
            }
        }

运行结果如下:
在这里插入图片描述
总的来说,这个方法只能说是差强人意,希望以后能发现更好的办法来解决这类问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值