在这个处理惩罚中我是用toString()要领来取得功效,可是假如正则表达式里是用了分组标记(圆括号),那么就可以用group(int gid)的要领来取得相应各组匹配的功效,如正则表达式改为" (/[[^]]+/])",那么就可以用以下要领来取得功效:pure=result.group(0);
用措施验证,输出功效同样为:kevin的音标为['kevin]
而假如正则表达式为(/[[^]]+/])(/[[^]]+/]),则会查找到两个持续的方括号所包括的内容,也就找到[音标] [词性]两项,可是两项的功效别离在两个组内里,别离由下面语句得到功效:
result.group(0)->返回[音标] [词性]两项内容,也就是与整个正则表达式相匹配的功效字符串,在这里也就为['kevin] [名词]
result.group(1) ->返回[音标]项内容,功效应是['kevin]
result.group(2) ->返回[词性]项内容,功效应是[名词]
继承用措施验证,发明输出并不正确,主要是当内容有中文时就不能乐成匹配,思量到大概是Jakarta-ORO正则表达式库版本不支持中文的问题,回看一下本来我一直用的照旧2.0.1的老版本,顿时到Jakarta.org上下载最新的2.0.4版本装上再用措施验证,得出的功效就和预期一样正确。
★查找多个匹配:
颠末第一步的实验利用Jakarta-ORO后,我们已经知道了如何正确利用该API包来查找方针字符串里一个匹配的子串,下面我们接着来看一看当方针字符串里包括不止一个匹配的子串时我们如何把它们一个接一个找出来举办相应的处理惩罚。
首先我们先试个简朴的应用,假设我们想把CONTNET字段内容里所有用方括号包起来的字串都找出来,很清楚地,CONTNET字段的内容内里就只有两项匹配的内容:[音标]和 [词性],适才我们其实已经把它们别离找出来了,可是我们所用的要领是分组要领,把"[音标] [词性]"作为一整个正则表达式匹配的内容先找到,再按照分组把[音标]和 [词性]别离挑出来。可是此刻我们需要做的是把[音标]和[词性]别离做为与同一个正则表达式匹配的内容,先找到一个接着再找下一个,也就是适才我们的表达式为(/[[^]]+/])(/[[^]]+/]),而此刻应为" /[[^]]+/] "。
我们已经知道在匹配操纵的三个要领里只要用PatternMatcherInput工具作为参数替代String工具就可以从字符串中最后一次匹配的位置开始继承举办匹配,实现的措施片断如下:
PatternMatcherInput input=new PatternMatcherInput(content); while (matcher.contains(input,pattern)) { result=matcher.getMatch(); System.out.println(result.group(0)) }
输出功效为:['kevin]
[名词]
接着我们来做巨大一点的处理惩罚,就是我们要先把下面内容:
['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词: 凯文)( Kevin is living in ZhuHai now. /凯文现住在珠海/名词: 凯文)}中的整个例句部门(也就是由大括号所包括的部门)找出来,再别离把例句一和例句二找出,而各例句中的各项内容(英文句、中文句、词性、表明)也要分项列出。
第一步虽然是要定出相应的正则表达式,需要有两个,一是和整个例句部门(也就是由大括号包起来的部门)匹配的正则表达式:"/{.+/}",
另一个则要和每个例句部门匹配(也就是小括号中的内容),:/(([^)]+/)
并且由于要把例句的各项疏散出来,所以要再把内里的各部门用分组的要领匹配出来:" ([^(]+)/(.+)/(.+):([^)]+) "。
为了轻便起见,我们不再和从数据库里读出,而是结构一个包括同样内容的字符串变量,措施片断如下:
try{ String content="['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词:凯文) (Kevin is living in ZhuHai now./凯文现住在珠海/名词: 凯文)}"; String ps1="//{.+//}"; String ps2="//([^)]+//)"; String ps3="([^(]+)/(.+)/(.+):([^)]+)"; String sentence; PatternCompiler orocom=new Perl5Compiler(); Pattern pattern1=orocom.compile(ps1); Pattern pattern2=orocom.compile(ps2); Pattern pattern3=orocom.compile(ps3); PatternMatcher matcher=new Perl5Matcher(); //先找出整个例句部门 if (matcher.contains(content,pattern1)) { MatchResult result=matcher.getMatch(); String example=result.toString(); PatternMatcherInput input=new PatternMatcherInput(example); //别离找出例句一和例句二 while (matcher.contains(input,pattern2)){ result=matcher.getMatch(); sentence=result.toString(); //把每个例句里的各项用分组的步伐脱离出来 if (matcher.contains(sentence,pattern3)){ result=matcher.getMatch(); System.out.println("英文句: "+result.group(1)); System.out.println("句子中文翻译: "+result.group(2)); System.out.println("词性: "+result.group(3)); System.out.println("意思: "+result.group(4)); } } } } catch(Exception e) { System.out.println(e); }