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