在做文本分析时,经常会用到字符串的相关操作,比如IndexOf、substring等,但对于简单的字符串处理还可以,一些相对复杂的处理,往往要写一大堆的代码去实现,有没有比较简洁方便的方案代替呢?正则表达式随之出现。
JDK本身也自带的有正则表达式的处理API,但Apache的Regexp据说更好用,我一向很相信Apache的产品,既然如此就拿来用用吧。首先从Apache网站下载Regexp的jar包,把它导入的工程的CLASSPATH当中。
下面我们实现一个判断字符串是否包含空调功率(几匹)的正则表达式,这个应该很简单,有两种情况:2匹或2.5匹这样子的表达形式,那程序可以这样实现:
final
String p1
=
"
"
;
if
(msg
!=
null
)
...
{
try...{
RE re=newRE(p1);
if(re.match(msg))...{
String str=re.getParen(0);
if(str.length()>1)...{
power=GFString.chinaNum2arebNum(str.substring(0,str.length()-1));
} }
}catch(RESyntaxException e)...{
e.printStackTrace();
}
}
此表达式对于像2匹、2.5匹的情况都能处理了,但是实际情况当中可能也会是中文数字,我们增加对中文数字表达方法的支持:
final String p1
=
"
(/d|[零一二三四五六七八九])([.。点](/d|[零一二三四五六七八九]))?匹“;
现在我们可以支持象:2.5匹、三匹,3。5匹这样子的表达形式了,但现在又有一个新的问题,象22.5匹、f2.5匹这样的情况,该模式也是匹配的,但实际上我们有基本常识的都知道,空调不会超过xx匹,最多也就3匹,5匹,并且x匹前面不应该出现字母的,所以需要进一步的完善:
final
String p1
=
"
(^|[^/w.。点零一二三四五六七八九])([0-5]|(([0-5]|[零一二三四五])[.。点](/d|[零一二三四五六七八九])))匹
"
;
至此,我们可以很准确地判断出一个文本当中是否含有空调的功率描述,并且可以通过getParen(0)得到它。
参考: