正则表达式

1.简介

正则表达式(Regular Expression) 用于指定字符串的模式,可以在任何需要定位匹配某种特定的字符串的情况下使用正则表达式. 例如 , 有一个示例程序用来定位HTML文件中的所有超链接,它是通过查找 <a href = “…" > 模式的字符串来实现此目的的.

当然,在指定模式时, … 标记法其实并不精确.需要精确地指定什么样的字符序列才是合法的匹配,这就要求无论何时,当你要描述一个模式时,都i需要使用某种特定的语法.

2.正则表达式语法

2.1 示例: [Jj]ava.+

匹配下列形式的所有字符串:

  • 第一个字母是J或j
  • 接下来的三个字符是 ava
  • 字符串的其余部分由一个或多个任意的字符构成

例如, 字符串 Javanese 就匹配这个特定的正则表达式,但是 字符串 Core Java” 就不匹配.

2.2 对于大多数情况,一小部分很直观的语法结构就足够够用了.

  • 字符类(character class) 是一个括号在括号中可选择的字符集,例如: **[Jj], [0-9], [A-Za-z] 或 [ ^ 0-9] ** .这里 “ - ” 表示是一个范围(所有Unicode 值 落在两个边界范围之内的字符),而 ^ 表示补集(除了指定字符之外的所有字符).
  • 如果字符类中包含 “ - ” 那么它必须是第一项或者是最后一项; 如果要包含 “[” ,那么它必须是第一项;如果要包含 “ ^ ” ,那么它可以使除开始位置之外的任何位置.其中,你只需要转义 “ [] ”“ \ ” .
  • 大部分字符都可以与他们自身匹配,例如在前面示例中的 ava 字符
  • . 符号可以匹配任何字符(有可能不包括终止符,这取决于标志的设置)
  • 使用 **\ ** 作为转义字符.
  • ^和$ 分别匹配一行的开头和结尾
  • 如果X和Y是正则表达式,那么XY表示 “任何X的匹配后跟着Y的匹配” , X | Y 表示 “ 任何X或Y的匹配” .
  • 可以将 量词 运用到表达式 *X: X+(1个或多个),X(0个或多个), X?(0个或1个) **
  • 默认情况下,量词要匹配能够使整个匹配成功的最大可能的重复次数.可以修改这种行为,方法是使用后缀 ? (使用勉强或吝啬匹配,也就是匹配最小的重复次数) 或使用后缀 + (使用占有或贪婪匹配,也就是即使让整个匹配失败,也要匹配到最大的重复次数)

例如: 字符串cab 匹配 [a-z]ab, 但是不匹配*[a-z]+ab**. .在第一种情况中,表达式**[a-z]** 只匹配字符c,使得字符ab匹配该模式的剩余部分;但是贪婪版本 [a-z]*+ 将匹配字符cab ,你事故的剩余部分将无法匹配.

  • 我们使用群组来定义子表达式, 其中群组用括号() 括起来.例如.([+-]?)([0-9]+).然后可以询问模式匹配器,让其返回每个组的匹配,或者使用 \n 来引用某个群组,***其中n是群组号(从 \1 开始)***.

例如: 下面是一个有些复杂但是却可能很有用的正则表达式,它描述了十进制和十六进制整数:

[+-]?[0-9]+|0[Xx][0-9A-Fa-f]+

遗憾的是,在使用正则表达式的各种程序和类库之间,表达式语法并未完全标准化.尽管在基本结构上达成了一致,但是它们在细节上人就存在着许多令人抓狂的差异.Java 正则表达式类使用的语法与Perl 语言使用的语法十分相似,但是并不完全一样.

3. 匹配字符串

正则表达式最简单的用法就是测试某个指定的字符串是否与他匹配.

Q.E.D.