快速业务通道

构建用于正则表达式的抽象Java API - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
ler =   org.acmsl.regexpplugin.RegexpManager.createCompiler();

但存在差异。正如前面提到的,该 API 对实际使用哪个具体实现加以隐藏。 您可以选择一个具体实现或保留缺省的 Jakarta Oro。如果所选的库在运行时不 可用,则 RegexpPlugin API 会尝试用它的类名创建一个编译器。如果该操作失 败,它会将异常发回 API 的客户机。

假定您一直在使用 JDK 1.4 的内置 regexp 类。那样的话,包含始终不会使 用的额外 jar 文件毫无意义。那就是为什么仅仅调用 createCompiler() 方法 还不够的原因。您需要管理这样的异常:每当所选的库不存在时就会抛出该异常 。因而必须更新示例:

try {   org.acmsl.regexpplugin.Compiler compiler =     org.acmsl.regexpplugin.RegexpManager.createCompiler(); } catch (org.acmsl.regexpplugin.RegexpEngineNorFoundException exception) {   [..] }

第 2 步:编译 regexp 模式。将正则表达式本身编译到 Pattern 对象中。

org.apache.oro.text.regex.Pattern pattern = compiler.compile(".*\\s*(.*?)\\s+.*", Perl5Compiler.MULTILINE_MASK);

注:您必须转义反斜杠(\)字符。

该模式对象代表以文本格式定义的正则表达式。请尽可能多地重用模式实例 。然后,如果 regexp 是固定的(缺少任何可变部分,如 “(.*?) Tom.*”),则模式应是类中的静态成员。

compile 方法适合用标志(如 EXTENDED_MASK )来配置(请参阅 参考资料 以获得更详细的 regexp 教程)。但是,RegexpPlugin 并不允许随意的标志。 受支持的标志只有 case sensitivity 和 multiline ,因为所有受支持的库都 可以处理它们。

编译器实例有特定的特性来定义这些标志:

compiler.setMultiline(true); org.acmsl.regexpplugin.Pattern pattern =   compiler.compile(".*\\s*(.*?)\\s+.*");

第 3 步:创建 Matcher 对象。在 Jakarta Oro中,这一步非常简单:

org.apache.oro.text.regex.Perl5Matcher matcher =   new org.apache.oro.text.regex.Perl5Matcher();

它之所以如此简单是因为它不需要构造任何信息。在后来的 regexp 中,它 将变得具体。基本上,RegexpPlugin 中的步骤差不多相似。您不必亲自创建 matcher ,而是可以将其代理给 RegexpManager 类:

org.acmsl.regexpplugin.Matcher matcher =   org.acmsl.regexpplugin.RegexpManager.createMatcher();

区别和前面一样,您需要处理 RegexpEngineNotFoundException 。实际上, RegexpManager 需要为您所选的库或缺省库创建 matcher 适配器。如果这样的 类在运行时不可用,它会抛出该异常。

构建用于正则表达式的抽象Java API(4)

时间:2010-12-24 Jose San Leandro Arm

第 4 步:评估正则表达式。 matcher 对象需要解释正则表达式并抽取所需 的信息。这在一行代码中完成:

if (matcher.contains("John A. Smith", pattern)) {

如果输入文本与正则表达式匹配,则该方法返回 true。隐含的副作用是,执 行该行代码之后, matcher 对象包含在输入文本中找到的第一个匹配项。接下 来的一步演示如何实际获取感兴趣的信息。

通过使用 RegexpPlugin API,在此时根本没有任何不同。

第 5 步:检索找到的第一个匹配项。 这一简单的步骤仅用一行完成:

org.apache.oro.text.regex.MatchResult matchResult = matcher.getMatch();

您可以声明一个局部变量来存储这样的对象,该对象含有与 regexp 匹配的 一段文本。在这两种情况下,该步骤是相同的,除了变量声明(因为一个是另一 个的适配器):

org.acmsl.regexpplugin.MatchResult matchResult =     matcher.getMatch();

第 6 步:获取感兴趣的 gr

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号