`
xzliulin
  • 浏览: 56959 次
  • 性别: Icon_minigender_1
  • 来自: 江苏徐州
社区版块
存档分类
最新评论

Jakarta-ORO正则表达式库连载2

    博客分类:
  • JAVA
阅读更多


在这个处理中我是用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


输出结果为:['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
}
}
}
catch(Exception e) {
System.out.println(e);
}




输出结果为:
英文句: Kevin loves comic.
句子中文翻译: 凯文爱漫画
词性: 名词
意思: 凯文
英文句: Kevin is living in ZhuHai now.
句子中文翻译: 凯文现住在珠海
词性: 名词
意思: 凯文

★查找替换:
以上的两个应用都是单纯在查找字符串匹配方面的,我们再来看一下查找后如何对目标字符串进行替换。

例如我现在想把第二个例句进行改动,换为:Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。

也就是把
['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词: 凯文)( Kevin is living in ZhuHai now. /凯文现住在珠海/名词: 凯文)}

改为:
['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词: 凯文)( Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。)}

之前,我们已经了解Util.substitute()方法与Substiution接口,以及Substiution的两个实现类StringSubstitution和Perl5Substitution,我们就来看看怎么用Util.substitute()方法配合Perl5Substitution来完成我们上面提出的替换要求,确定正则表达式:

我们要先找到其中的整个例句部分,也就是由大括号包起来的字串,并且把两个例句分别分组,所以正则表达式为:"\{(\([^)]+\))(\([^)]+\))\}",如果用替换变量来代替分组,那么上面的表达式可以看为"\{\}",这样就可以更容易看出替换变量与分组间的关系。

根据上面的正则表达式Perl5Substitution类可以这样构造:
Perl5Substitution("{( Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。)}")

再根据这个Perl5Substitution对象来使用Util.substitute()方法便可以完成替换了,实现的代码片段如下:

try{
String content="['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词: 凯文)(Kevin lives in ZhuHai now./凯文现住在珠海/名词: 凯文)}";
String ps1="\{(\([^)]+\))(\([^)]+\))\}";
String sentence;
String pure;
PatternCompiler orocom=new Perl5Compiler();
Pattern pattern1=orocom.compile(ps1);
PatternMatcher matcher=new Perl5Matcher();
String result=Util.substitute(matcher,
pattern1,new Perl5Substitution(
"{( Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。)}",1),
content,Util.SUBSTITUTE_ALL);
System.out.println(result);
}
catch(Exception e) {
System.out.println(e);
}




输出结果是正确的,为:
['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词: 凯文)( Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。)}

至于有关使用numInterpolations参数的构造器用法,读者只要根据上面的介绍自己动手试一下就会清楚了,在此就不再例述。

总结:
本文首先介绍了Jakarta-ORO正则表达式库的对象与方法,并且接着举例让读者对实际应用有进一步的了解,虽然例子都比较简单,但希望读者们在看了该文后对Jakarta-ORO正则表达式库有一定的认知,在实际工作中有所帮助与启发。

其实在Jakarta org里除了Jakarta-ORO外还有一个百分百的纯JAVA正则表达式库,就是由Jonathan Locke赠与Jakarta ORG的Regexp,在该包里面包含了完整的文档以及一个用于调试的Applet例子,对其有兴趣的读者可以到此下载。

分享到:
评论
1 楼 ztkx 2009-06-19  
有个正则表达式的问题,比如

sn::XAWEASDSAKSNA==
o: upup
photo :< file:///home/pki/png.png

我用"([^:<])\s*(:[:<]*")\s*([^]+)$",用regexp和oro的applet测试都ok
但是在netbeans下编译会遇到posix错误,不知道如何解决

相关推荐

    Jakarta-ORO正则表达式库

    jakarta-oro.jar包供大家享用 博文链接:https://xzio.iteye.com/blog/117213

    jakarta-oro-2.0.8 java正则表达式扩展

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是由Apache软件基金会开发的一个Java正则表达式库。它是对Java内置的正则表达式功能的扩展,提供了更丰富的功能和更高的性能。Jakarta ORO在Java社区中...

    Java正则表达式应用-Jakarta-ORO篇.doc

    Java正则表达式是Java语言中用于处理文本和模式匹配的重要工具,虽然在早期的Java版本中并未直接内置正则表达式支持,但通过引入第三方库如Jakarta-ORO,开发者可以方便地在Java应用中使用正则表达式。Jakarta-ORO是...

    jakarta-oro-2.0.8.rar_Perl5Util jar_jakarta-oro-2.0.8_oro

    Jakarta ORO(Oracle Regular Expressions for Java)是Apache软件基金会的一个开源项目,它提供了一个高性能的Java正则表达式引擎。这个项目的主要目标是为Java开发者提供与Perl 5正则表达式语法兼容的库,名为Perl...

    强大的JAVA正则表达式处理包jakarta-oro

    Jakarta ORO(Oracle Regular Expressions for Java)是Apache软件基金会开发的一个强大的Java正则表达式库,它为开发者提供了更为灵活和高效的正则表达式处理功能。在Java标准库中的java.util.regex包之外,Jakarta...

    jakarta-oro.rar 正则表达式包

    Jakarta ORO(Oracle Regular Expressions for Java)是Apache软件基金会的一个开源项目,它提供了一个高性能的Java正则表达式库。这个库是基于Perl 5的正则表达式语法,为Java开发者提供了强大的文本匹配和处理功能...

    java/Android 正则表达式详解

    Jakarta-ORO 库是一个开放的源代码库,提供了正则表达式的实现。使用 Jakarta-ORO API,可以轻松地使用正则表达式进行文本处理。 实践应用 ---------- 正则表达式可以应用于各种领域,例如文本处理、数据提取、...

    commons-net-1.4.1 和 jakarta-oro-2.0.8 .rar

    Jakarta ORO为Java应用程序提供了一个强大的正则表达式处理引擎,它基于Perl 5的正则表达式语法。在Java 1.4及更早版本中,正则表达式功能相对较弱,而Jakarta ORO填补了这一空白,提供了更丰富的匹配和替换功能。...

    FTP上传下载所需jakarta-oro-2.0.8.jar.rar

    Jakarta ORO是Apache软件基金会开发的一个开源Java库,它主要提供正则表达式处理功能。这个库在很多Java项目中被广泛使用,特别是在需要文本匹配、搜索和替换的场景下。Jakarta ORO库包含了Perl 5风格的正则表达式...

    jakarta-oro-2.0.8.zip

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是由Apache软件基金会开发的一个开源项目,主要用于Java平台的正则表达式处理。这个项目在Java社区中被广泛使用,为开发者提供了一套强大的文本匹配和搜索...

    jakarta-oro-2.0.8.zip_jakarta oro.jar 2.0_jakarta-oro-2_jakarta-

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是一个开源项目,它为Java平台提供了强大的正则表达式处理库。Jakarta ORO是Apache软件基金会Jakarta项目的一部分,其版本号为2.0.8,这表明它是经过多次...

    jakarta-oro.jar

    Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做OROMatcher,是由Daniel F. Savarese编写,后来他赠给Jakarta Project。... Jakarta-ORO正则表达式库支持Perl5兼容的正则表达式语法。

    jakarta-oro-2.0.1.zip_Jakarta ORO _Jakarta-O_jakarta-oro-2_jakar

    Jakarta ORO,全称是Oracle Regular Expressions for Java,是一个由Apache软件基金会开发的Java库,主要用于处理正则表达式。这个库在Java社区中广泛使用,因为它提供了比Java内置正则表达式引擎更丰富的功能和更高...

    java 正则表达式 perl5规范 jakarta-oro.jar

    Jakarta ORO(Oracle RegEx)库是Apache软件基金会的一个项目,它是一个高性能的Java正则表达式实现,受到了Perl 5正则表达式的启发。在Java中,`java.util.regex`包提供了正则表达式的核心支持,而Jakarta ORO则...

    jakarta-oro-2.0

    Jakarta-ORO是最全面以及优化得最好的正则表达式API之一,Jakarta-ORO库以前叫做...许多源代码开放的正则表达式库都是支持Perl5兼容的正则表达式语法,Jakarta-ORO正则表达式库也不例外,他与Perl 5正则表达式完全兼容

    ant-jakarta-oro-1.6.1.jar.zip

    标题中的"ant-jakarta-oro-1.6.1.jar.zip"是一个压缩文件,它包含的是Jakarta ORO库的1.6.1版本,该库是为Apache Ant项目设计的一个正则表达式处理组件。Apache Ant是一个广泛使用的Java构建工具,类似于Unix的make...

    apache的FTP包commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar

    `jakarta-oro-2.0.8.jar`则是Jakarta ORO(Oracle Regular Expressions for Java)库,它提供了Perl 5风格的正则表达式支持。虽然在FTP操作中不是必需的,但它在处理字符串时非常有用,比如在解析FTP服务器返回的...

Global site tag (gtag.js) - Google Analytics