软件构造实验遇到的问题
在进行学校的软件构造实验时,我遇到了一些问题,故以此方式记录下来,希望以后自己有能力解决。
正则表达式的使用
在使用正则表达式进行字符串匹配时,我希望在匹配成功之后用group()函数将我需要的字段给分别提取出来,结果却遇到了我无法解决的问题。
我需要匹配的字符串类似于a3|b4|r7
、c5|r9|n0|t4|m9
、m9
这种有着数字和字母以及|
,并且前半部分的长度还是不确定。为了匹配这个字符串,我写出的正则表达式为([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()));
}
}
运行结果如下:
总的来说,这个方法只能说是差强人意,希望以后能发现更好的办法来解决这类问题。