常用正则表达式
表达式 | 描述 |
---|---|
. | 匹配出换行符外任意字符 |
\ | 转义符,可以将一些有特殊含义的字符转化为本身含义,如\.代表点本身的含义。 |
[ ] | 匹配中括号中字符的一个,如[abc]表示匹配a、b、c中的一个字符。 |
| | 匹配两个字符中的一个,如a|b表示匹配a或者b。 |
[0-9A-Za-z] | 字符区间,[0-9]表示0-9中的一个数。 |
^ | 取非匹配,[^0-9]表示不是0-9中的一个字符。 |
\d | 匹配数字 |
\D | 匹配非数字 |
\w | 匹配字母 |
\W | 匹配非字母 |
+ | 匹配一个或多个字符,如\d+表示匹配一个或多个数字。 |
* | 匹配0个或多个字符。 |
? | 匹配0个或一个字符。 |
{n} | 匹配多次,如\w{3}表示匹配3个字母。 |
{m,n} | 匹配次数是一个区间,如\d{2,4}表示匹配2-4个数字。 |
{n,} | 匹配至少次数的字符。 |
() | 标记一个子表达式开始和结束 |
^ | 放在外面表示匹配字符串开始位置,如果是在方括号内表示取非 |
$ | 匹配字符串结束位置 |
\f | 匹配一个换页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符,等价于[ ^\f\n\r\t\v] |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
\b | 匹配一个单词边界,即字与空格间位置 |
\B | 匹配一个非单词边界 |
?= | 向前匹配,如?=:表示匹配:然后向前匹配,最后结果不包含: |
?<= | 向前匹配,如(?<=\$)[0-9.]+表示匹配$然后向后匹配,最后结果不包含$ |
防止过度匹配
* 和+ 都是所谓的“贪婪型”元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止的。它们会尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配时为止。
为了防止这种贪婪型匹配,我们需要使用对应字符的惰性版本,* 使用 *?,+ 使用 +?,{n,}使用{n,}?
回溯引用
回溯引用指的是模式的后半部分引用在前半部分中定义的子表达式。如 <hH>.*?</[hH]\1>,这其中最后的\1表示前面第一个子表达式匹配的结果,即([1-6]),依此类推,\2表示第二个子表达式,\n表示第n个子表达式。
回溯引用在替换操作中也很有用,如(\d{3})(-)(\d{3})(-)(\d{4})这个正则表达式,使用替换的表达式($1) $3-$5,可以将匹配到的字符替换成别的格式。其中$1,$3,$5分别表示第1,第3,第5个子表达式。