`
rewop998
  • 浏览: 37397 次
  • 来自: ...
社区版块
存档分类
最新评论

正则表达式

    博客分类:
  • Java
阅读更多

 

如果你曾经用过 Perl 或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么 正则表达式 Regular Expression )就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。     

许多语言,包括 Perl PHP Python JavaScript JScript ,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级 搜索 - 替换 功能。那么 Java 又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的 Java 规范需求( Specification Request )已经得到认可,你可以期待在 JDK 的下一版本中看到它。     

然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从 Apache.org 下载源代码开放的 Jakarta-ORO 库。本文接下来的内容先简要地介绍正则表达式的入门知识,然后以 Jakarta-ORO API 为例介绍如何使用正则表达式。     

一、正则表达式基础知识     

               

我们先从简单的开始。假设你要搜索一个包含字符 “cat” 的字符串,搜索用的正则表达式就是 “cat” 。如果搜索对大小写不敏感,单词 “catalog” “Catherine” “sophisticated” 都可以匹配。也就是说:     

  <!----><!----> <!----><!----><!----> <!---->    

 

  1.1 句点符号     

假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以 “t” 字母开头,以 “n” 字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符 —— 句点符号 “.” 。这样,完整的表达式就是 “t.n” ,它匹配 “tan” “ten” “tin” “ton” ,还匹配 “t#n” “tpn” 甚至 “t n” ,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、 Tab 字符甚至换行符:

为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号( “[]” )里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式 “t[aeio]n” 只匹配 “tan” “Ten” “tin” “ton” 。但 “Toon” 不匹配,因为在方括号之内你只能匹配单个字符:     

 

 

 

  1.3 “ 符号     

如果除了上面匹配的所有单词之外,你还想要匹配 “toon” ,那么,你可以使用 “|” 操作符。 “|” 操作符的基本意义就是 运算。要匹配 “toon” ,使用 “t(a|e|i|o|oo)n” 正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号 “()” 。圆括号还可以用来分组,具体请参见后面介绍。     

 

  1.4 表示匹配次数的符号     

表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

  <!----><!----> <!---->    

假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是 999-99-9999 。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符( “-” )有着特殊的意义,它表示一个范围,比如从 0 9 。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符 “\”     

  <!----><!----> <!---->

假设进行搜索的时候,你希望连字符号可以出现,也可以不出现 —— 即, 999-99-9999 999999999 都属于正确的格式。这时,你可以在连字符号后面加上 数量限定符号,如图二所示:   

  <!----><!----> <!---->

图二:匹配所有 123-12-1234 123121234 形式的社会安全号码     

               

下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分 “[0-9]{4}” ,再加上字母部分 “[A-Z]{2}” 。图三显示了完整的正则表达式。  

  <!----><!----> <!---->

图三:匹配典型的美国汽车牌照号码,如 8836KV    

 

  1.5 “ 符号     

  “^” 符号称为 符号。如果用在方括号内, “^” 表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以 “X” 字母开头的单词除外。     

  <!----><!----> <!---->

图四:匹配所有单词,但 “X” 开头的除外     

  1.6 圆括号和空白符号     

假设要从格式为 “June 26, 1951” 的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:

  <!----><!----> <!---->

图五:匹配所有 Moth DD,YYYY 格式的日期     

新出现的 “\s” 符号是空白符号,匹配所有的空白字符,包括 Tab 字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用 ORO API (本文后面详细讨论)提取出它的值。修改后的正则表达式如图六所示:     

  <!----><!----> <!---->

图六:匹配所有 Month DD,YYYY 格式的日期,定义月份值为第一个组     

  1.7 其它符号     

为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如表二所示:     

表二:常用符号     

  <!----><!----> <!---->

例如,在前面社会安全号码的例子中,所有出现 “[0-9]” 的地方我们都可以使用 “\d” 。修改后的正则表达式如图七所示:

  <!----><!----> <!---->

图七:匹配所有 123-12-1234 格式的社会安全号码     

二、 Jakarta-ORO     

               

有许多源代码开放的正则表达式库可供 Java 程序员使用,而且它们中的许多支持 Perl 5 兼容的正则表达式语法。我在这里选用的是 Jakarta-ORO 正则表达式库,它是最全面的正则表达式 API 之一,而且它与 Perl 5 正则表达式完全兼容。另外,它也是优化得最好的 API 之一。     

  Jakarta-ORO 库以前叫做 OROMatcher Daniel Savarese 大方地把它赠送给了 Jakarta Project 。你可以按照本文最后参考资源的说明下载它。     

我首先将简要介绍使用 Jakarta-ORO 库时你必须创建和访问的对象,然后介绍如何使用 Jakarta-ORO API     

  PatternCompiler 对象     

               

首先,创建一个 Perl5Compiler 类的实例,并把它赋值给 PatternCompiler 接口对象。 Perl5Compiler PatternCompiler 接口的一个实现,允许你把正则表达式编译成用来匹配的 Pattern 对象。  

  <!----><!----> <!---->

  Pattern 对象     

要把正则表达式编译成 Pattern 对象,调用 compiler 对象的 compile() 方法,并在调用参数中指定正则表达式。例如,你可以按照下面这种方式编译正则表达式 “t[aeio]n”     

  <!----><!----> <!---->

默认情况下,编译器创建一个大小写敏感的模式( pattern )。因此,上面代码编译得到的模式只匹配 “tin” “tan” “ten” “ton” ,但不匹配 “Tin” “taN” 。要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数:    

  <!----><!----> <!---->

创建好 Pattern 对象之后,你就可以通过 PatternMatcher 类用该 Pattern 对象进行模式匹配。     

  PatternMatcher 对象     

  PatternMatcher 对象根据 Pattern 对象和字符串进行匹配检查。你要实例化一个 Perl5Matcher 类并把结果赋值给 PatternMatcher 接口。 Perl5Matcher 类是 PatternMatcher 接口的一个实现,它根据 Perl 5 正则表达式语法进行模式匹配:  

  <!----><!----> <!---->

使用 PatternMatcher 对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串:

  · boolean matches(String input, Pattern pattern) :当输入字符串和正则表达式要精确匹配时使用。换句话说,正则表达式必须完整地描述输入字符串。     

  · boolean matchesPrefix(String input, Pattern pattern) :当正则表达式匹配输入字符串起始部分时使用。

  · boolean contains(String input, Pattern pattern) :当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。     

另外,在上面三个方法调用中,你还可以用 PatternMatcherInput 对象作为参数替代 String 对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时,用 PatternMatcherInput 对象作为参数就很有用了。用 PatternMatcherInput 对象作为参数替代 String 时,上述三个方法的语法如下:  

  · boolean matches(PatternMatcherInput input, Pattern pattern)    

  · boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)    

  · boolean contains(PatternMatcherInput input, Pattern pattern)    

三、应用实例     

下面我们来看看 Jakarta-ORO

分享到:
评论

相关推荐

    qt使用正则表达式限制lineEdit的输入,对正则表达式进行了封装,可以直接引入,工程编译正常

    在Qt框架中,正则表达式(Regular Expression)是一种强大的文本处理工具,它允许程序员以结构化的方式匹配、查找、替换或验证字符串。本项目针对Qt的lineEdit组件,通过正则表达式实现了输入限制功能,使得lineEdit...

    正则表达式转换工具

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串处理的各个领域。正则表达式转换工具是专门针对这一需求而设计的,它能帮助用户将输入的内容转换...

    PB实现的正则表达式

    在IT领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它能够进行复杂的模式匹配、查找、替换等操作。在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则...

    易语言正则表达式文本替换

    例如,"子程序_正则文本替换"可能就是一个易语言中用于执行正则表达式替换的子程序,它接收输入的文本、正则表达式模式和替换字符串,然后返回经过替换操作的新文本。 1. **正则表达式基础** - **元字符**:如`.`...

    C语言正则表达式库

    C语言正则表达式库是用于在C编程环境中处理和匹配正则表达式的软件库。这个库名为PCRE(Perl Compatible Regular Expressions),正如其名,它与Perl语言中的正则表达式语法高度兼容,提供了丰富的功能和强大的匹配...

    pb 使用正则表达式源码pbregexp

    标题中的“pb 使用正则表达式源码pbregexp”指的是在PowerBuilder(简称pb)环境中,利用名为“pbregexp”的正则表达式组件来实现源代码级别的正则表达式操作。PowerBuilder是一款流行的可视化的、面向对象的软件...

    Java使用正则表达式提取XML节点内容的方法示例

    Java使用正则表达式提取XML节点内容的方法示例 Java使用正则表达式提取XML节点内容的方法示例主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作...

    易语言正则表达式匹配中文

    在易语言中,正则表达式是进行文本处理、数据提取和搜索的关键工具,尤其在处理中文字符时显得尤为重要。本文将深入探讨易语言中的正则表达式匹配中文的原理、方法以及应用。 正则表达式(Regular Expression)是一...

    正则表达式在数据库查询中的应用

    ### 正则表达式在数据库查询中的应用 #### 引言 在数据库管理与应用程序开发中,查询数据是一项常见的任务。传统的SQL查询虽然强大,但在处理复杂查询时可能存在一定的局限性,尤其是涉及到文本数据的模式匹配时。...

    正则表达式调试工具

    正则表达式(Regular Expression,简称regex)是用于在文本中匹配特定模式的强大工具,广泛应用于数据验证、搜索替换和文本处理等领域。正则表达式调试工具是开发人员用来测试和优化这些模式的重要辅助工具。本文将...

    VC、VC++,MFC 正则表达式类库

    正则表达式类库则为VC++和MFC的开发者提供了对正则表达式功能的支持。 "VC、VC++,MFC 正则表达式类库"指的是在MFC中实现或集成的正则表达式处理模块。这个库通常包含一系列的类和函数,允许程序员编写符合特定模式...

    易语言正则表达式类匹配中文

    在易语言中,正则表达式类是一个非常重要的工具,用于处理字符串的模式匹配和查找。在处理中文文本时,这个功能尤为关键,因为中文字符的编码和处理方式与英文有所不同。 正则表达式是用于匹配字符串模式的一种强大...

    Delphi2010正则表达式插件

    《Delphi 2010正则表达式插件详解》 在编程世界中,正则表达式(Regular Expression)是一种强大的文本处理工具,能够帮助开发者高效地进行字符串的匹配、查找、替换等操作。在Delphi 2010这个经典的集成开发环境中...

    正则表达式测试工具C#版(src)

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索。在C#编程语言中,正则表达式被广泛应用于数据验证、文本提取、格式转换等多个场景。本项目提供了一个C#编写的正则表达式测试工具,包含完整...

    c++写的正则表达式验证工具

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。C++作为一种通用编程语言,虽然标准库中没有内置正则表达式支持,但通过第三方库如Boost,我们可以很方便地在...

    通过正则表达式生成数据

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,它用于匹配、查找、替换等操作,涉及字符串的模式匹配。在本主题中,我们将深入探讨如何使用正则表达式来生成满足特定条件的随机数据。这在...

    C#正则表达式大全, 判断字符串是否为正整数,中文,英文.....

    C# 正则表达式大全 正则表达式是指用来描述字符串模式的表达式,通过使用正则表达式,我们可以轻松地实现字符串的匹配、验证、提取和替换等操作。在 C# 中,我们可以使用 System.Text.RegularExpressions 命名空间...

    C正则表达式库

    在IT领域,正则表达式库是用于处理字符串匹配、搜索和替换的重要工具。在C语言环境中,GUN(GNU)提供了一个官方的正则表达式库,这使得C程序员可以方便地在他们的应用程序中利用正则表达式的强大功能。本篇文章将...

    易语言正则表达式取网址和名称

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换等操作。在本案例中,“易语言正则表达式取网址和名称”指的是使用易语言这一编程环境,结合正则表达式技术来从文本中...

    正则表达式 必知必会 pdf

    正则表达式作为一种文本处理工具,在计算机编程和数据处理领域中扮演着极其重要的角色。它不仅适用于几乎所有编程语言和计算机平台,而且能够执行复杂的文本搜索、匹配、替换和提取操作。正则表达式的核心是通过定义...

Global site tag (gtag.js) - Google Analytics