Java正则表达式
字符类
字符 | 说明 |
[abc] | a,b或c中的任意一个字符 |
[^abc] | 除a,b或c中的字符外的任意一个字符(补) |
[a-zA-Z] | A至Z或a至z中的任意一个字符(范围) |
[a-d[m-p]] | a至d,m至p中的任意一个字符:[a-dm-p] (并) |
[a-z&&[def]] | d ,e 或者f(交) |
[a-z&&[^def]] | a 至z但除d、e或f外(减) |
说明:[]中只匹配单个字符.
因为-表示范围,所以要匹配-要使用\-。
预定义字符
字符 | 说明 |
. | 通配符,匹配除最后行终止符\n之外的任意字符。 |
\ | 转义字符,如\\匹配\,\.匹配.,\-匹配-等。 |
\d | 数字:[0-9] |
\D | 非数字:[^0-9] |
\s | 空格字符:[\t\n\x0B\f\r] |
\S | 非空格字符:[^\s] |
\w | 单词字符:[a-bA-Z_0-9] |
\W | 非单词字符:[^\w] |
|
|
|
|
|
|
量词
字符 | 说明 | ||
贪婪模式(Greedy )(默认) | 勉强模式(Reluctant) | 占有模式(Possessive) |
|
X? | X?? | X?+ | 匹配X ,0或1次 |
X* | X*? | X*+ | 匹配X ,至少0次(0或0次以上) |
X+ | X+? | X++ | 匹配X ,至少1次(1或1次以上) |
X{n} | X{n}? | X{n}+ | 匹配X,n次 |
X{n,} | X{n,}? | X{n,}+ | 匹配X,至少n次 |
X{n,m} | X{n,m}? | X{n,m}+ | 匹配X,至少n次,但不多于m次 |
Greedy的表达式会一直匹配下去,直到匹配不下去为止。(如果你发现表达式匹配的结果和预期的不符),非常有可能是因为,你以为表达式会只匹配前面几个字符,而实际上他是greedy的,因此会一直匹配下去。
Reluctant 的表达式只匹配最少的字符。也称为lazy, minimal matching, non-greedy, 或ungreedy。
Possessive: 目前只有Java支持(其他语言都不支持)。用正则表达式匹配字符串的时候会产生非常多中间状态(一般的匹配引擎会保存这种中间状态),这样匹配失败的时候就能原路返回。占有型的表达式不保存这种中间状态,因此也就不会回头重来了。他能防止正则表达式的失控,同时也能提高运行的效率。
如:要匹配美国的社会安全号码, 这个号码的格式是999-99-9999或999999999(-可以不出现),正则表达式为:[0-9]{3}\-?[0-9]{2}\-?[0-9]{4}。
边界匹配符
字符 | 说明 |
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\z | 输入的结尾 |
\Z | 除最后行终止符\n之外的输入结尾 |
\G | 上个匹配的结尾 |
说明:“^”如果用在[]括号内,表示“否”,即该字符除外。但用在[]括号外如“^X”则表示以行X开头。
例如:
\B 匹配非单词边界,"er\B" 能匹配 "verb" 中的 "er",但不能匹配 "never" 中的 "er"。
"\bev" 能匹配 "every" 中的 "ev",但不能匹配 "never" 中的 "ev"。
集合操作
字符 | 说明 |
XY | X的匹配后面跟着Y的匹配 |
X|Y | 匹配X或Y。 |
如:java|hello 将匹配包含java或hello的字符串。
如:tool:(java|ruby|c),可以匹配tool:java,或tool:ruby,或tool:c,注意不能使用[],因为[]里面只能匹配单个字符。
如:(b│cd)ef 匹配包含 "bef" 或者 "cdef"的字符串.
如:"(a│b)*c": 匹配包含0个或多个a或b,后面跟一个c的字符串。
lxm整理,只为知识共享之用,所有内容均来自网络,内容归所有者。
2009.04.16