首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Java 正则表达式详解(5)

Java 正则表达式详解(5)

Java 正则表达式语法为了更有效的使用正则表达式,需要了解正则表达式语法。正则表达式语法很复杂,可以写出非常高级的表达式。只有通过大量的练习才能掌握这些语法规则。
本篇文字,我们将通过例子了解正则表达式语法的基础部分。介绍重点将会放在为了使用正则表达式所需要了解的核心概念,不会涉及过多的细节。详细解释,参见 Java DOC 中的 Pattern 类.
基本语法在介绍高级功能前,我们先快速浏览下正则表达式的基本语法。
字符是正则表达式中最经常使用的的一个表达式,作用是简单的匹配一个确定的字符。例如:
John



这个简单的表达式将会在一个输入文本中匹配John文本。
可以在表达式中使用任意英文字符。也可以使用字符对于的8进制,16进制或unicode编码表示。例如:
101

\x41

\u0041



以上3个表达式 都表示大写字符A。第一个是8进制编码(101),第2个是16进制编码(41),第3个是unicode编码(0041).
字符分类字符分类是一种结构,可以针对多个字符匹配而不只是一个字符。换句话说,一个字符分类匹配输入文本中的一个字符,对应字符分类中多个允许字符。例如,你想匹配字符 a,b 或c,表达式如下:
[abc]



用一对方括号[] 表示字符分类。方括号本身并不是要匹配的一部分。
可以用字符分类完成很多事。例如想要匹配单词John,首字母可以为大写和小写J.
[Jj]ohn



字符分类[Jj] 匹配J或j,剩余的 ohn 会准确匹配字符ohn.
预定义字符分类正则表达式中有一些预定义的字符分类可以使用。例如, \d 表示任意数字, \s 表示任意空白字符,\w 表示任意单词字符。
预定义字符分类不需要括在方括号里,当然也可以组合使用
\d

[\d\s]



第1个匹配任意数字,第2个匹配任意数字或空白符。
完整的预定义字符分类列表,在本文最后列出。
边界匹配正则表达式支持匹配边界,例如单词边界,文本的开头或末尾。例如,\w 匹配一个单词,^匹配行首,$ 匹配行尾。
^This is a single line$



上面的表达式匹配一行文本,只有文本 This is a single line。注意其中的行首和行尾标志,表示不能有任何文本在文本的前面后后面,只能是行首和行尾。
完整的匹配边界列表,在本文最后列出。
量词匹配量词可以匹配一个表达式多次出现。例如下列表达式匹配字母A 出现0次或多次。




量词 * 表示0次或多次。+ 表示1次或多次。? 表示0次或1次。还有些其他量词,参见本文后面的列表。
量词匹配分为 饥饿模式,贪婪模式,独占模式。饥饿模式 匹配尽可能少的文本。贪婪模式匹配尽可能多的文本。独占模式匹配尽可能多的文本,甚至导致剩余表达式匹配失败。
以下演示饥饿模式,贪婪模式,独占模式区别。假设以下文本:
John went for a walk, and John fell down, and John hurt his knee.



饥饿模式下 表达式:
John.*?



这个表达式匹配John 后跟0个或多个字符。 . 表示任意字符。* 表示0或多次。? 跟在 * 后面,表示 * 采用饥饿模式。
饥饿模式下,量词只会匹配尽可能少的字符,即0个字符。上例中的表达式将会匹配单词John,在输入文本中出现3次。
如果改为贪婪模式,表达式如下:
John.*



贪婪模式下,量词会匹配尽可能多的字符。现在表达式会匹配第一个出现的John,以及在贪婪模式下 匹配剩余的所有字符。这样,只有一个匹配项。
最后,我们改为独占模式:
John.*+hurt



*后跟+ 表示独占模式量词。
这个表达式在输入文本中没有匹配项,尽管文本中包括 John 和 hurt. 为什么会这样? 因为 .*+ 是独占模式。与贪婪模式下,尽可能多的匹配文本,以使整个表达式匹配不同。独占模式会尽可能的多的匹配,但不考虑表达式剩余部分是否能匹配上。
.*+ 将会匹配第一个John之后的所有字符,这会导致表达式中剩余的 hurt 没有匹配项。如果改为贪婪模式,会有一个匹配项。表达式如下:
John.*hurt



逻辑操作符正则表达式支持少量的逻辑运算(与,或,非)。
与操作是默认的,表达式 John ,意味着J 与 o与h与n。
或操作需要显示指定,用 | 表示。例如表达式 John|hurt 意味着John 或 hurt 。
返回列表