常用正则表达式
2011-11-08 11:35 xtsjh0001 阅读(275) 评论(0) 编辑 收藏 举报
一.常用符号
字符 |
实例 |
说明 |
备注 |
\ |
$ ( ) * + . ? [ \ ^ { | \a\e\f\n\r\t\v “\\”匹配”\”,”\(“匹配”(“,”\t”代表换行。 |
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 |
|
^ |
|
匹配输入字符串开始的位置。 |
定位符 |
$ |
|
匹配输入字符串结尾的位置。 |
|
\< |
|
匹配单词首。 |
|
\> |
|
匹配单词尾。 |
|
\b |
“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”,“\bend\b”仅匹配“end”。 |
匹配一个字边界,即字与空格间的位置。 |
|
\B |
“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。 |
非字边界匹配。 |
|
* |
zo* 可匹配“z”、“zoo”,* 等效于 {0,}。 |
零次或多次匹配前面的字符或子表达式。 |
限定符 |
+ |
“zo+”与“zo”和“zoo”匹配,但与“z”不匹配,+ 等效于 {1,}。 |
一次或多次匹配前面的字符或子表达式。 |
|
? |
“do(es)?”匹配“do”或“does”中的“do”,? 等效于 {0,1}。
在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。 |
零次或一次匹配前面的字符或子表达式。当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心”,也即匹配搜索到的、尽可能短的字符串。而默认的“贪心”模式匹配搜索到的、尽可能长的字符串。 |
|
{n} |
“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 |
n 是非负整数,正好匹配 n 次。 |
|
{n,} |
“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。 |
n 是非负整数。至少匹配 n 次。 |
|
{,n} |
“o{,3}”不匹配“Boooob”中的“o”,而匹配“food”中的所有 o。 |
n 是非负整数。最多匹配 n 次。 |
|
{n,m} |
“o{1,3}”匹配“fooooood”中的头三个 o。 |
m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。 |
|
. |
注意:若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。 |
匹配除“\n”之外的任何单个字符。 |
|
x|y |
'z|food' 匹配‘z’或‘food’。'(z|f)ood' 匹配‘zood’或‘food’。 |
匹配 x 或 y。 |
|
[xyz] |
‘[abc]’匹配‘plain’中的‘a’。 |
匹配字符集内包含的任一字符。 |
|
[^xyz] |
‘[^abc]’匹配‘plain’中的‘p’。 |
反向匹配。匹配字符集内未包含的任何字符。 |
|
[a-z] |
“[a-z]”匹配“a”到“z”范围内的任何小写字母。 |
字符范围。匹配指定范围内的任何字符。 |
|
[^a-z] |
“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。 |
反向范围字符。匹配不在指定的范围内的任何字符。 |
|
\d |
等效于 [0-9]。 |
数字字符匹配。 |
|
\D |
等效于 [^0-9]。 |
非数字字符匹配。 |
|
\w |
与“[A-Za-z0-9_ ]”等效。 |
任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_中任意一个。 |
|
\W |
与“[^A-Za-z0-9_ ]”等效。 |
与任何非单词字符匹配。 |
|
\x |
等同于[0-9A-Fa-f]。 |
匹配十六进制数字。 |
|
\X |
等同于[^0-9A-Fa-f]。 |
匹配非十六进制数字。 |
|
\s |
等效于[\f\n\r\t\v]。 |
匹配任何空白字符,包括空格、制表符、换页符等。 |
|
\S |
等效于[^ \f\n\r\t\v]。 |
匹配任何非空白字符。 |
|
\f |
等效于 \x0c 和 \cL。 |
换页符匹配。 |
不可打印字符 |
\n |
等效于 \x0a 和 \cJ。 |
换行符匹配。 |
|
\r |
等效于 \x0d 和 \cM。 |
匹配一个回车符。 |
|
\t |
等效于\x09 和 \cI。 |
制表符匹配。 |
|
\v |
等效于\x0b 和 \cK。 |
垂直制表符匹配。 |
|
( ) |
'(z|f)ood' 中表达式匹配的文本时z和f。 |
用括号来“记住”子表达式匹配的文本 |
|
- |
[-A-Z0-9a-z._?+]该例表示匹配-,所有字母,所有数字,点,下划线,问号,加号; |
连字符。若要匹配连字符,就必须把连字符放在集合的最前面。 |
|
| |
若要匹配grey或者gray,可以写成 另外,若想匹配Grey或者grey,可以写成(G|g)rey,也可在grep的时候加上参数-i |
或。‘|’前后字符都满足条件。 |
|
& |
s/.*/&test/g表示在每行的末尾加上一个字符串test。&代表.*所匹配的字符串值。 |
在替换字符串中,符号&代表正则表达式所匹配的字符串的值。 |
& |
\num |
(.)\1匹配两个连续的相同字符。 ([a-z])([0-9])\1\2 其中\1代表[a-z]匹配的内容,而\2代表[0-9] |
此处的num是一个正整数。用数字来表示第number个括号所代表的子表达式 |
|
二.常用正则表达式
- 查找重复单词:grep –i ‘\<([a-z]+) +\1\>’ files
- 删除空行:sed "/^\s*$/d" filename >newfile
- 匹配所有:.*
- Html和css中的十六进制值:^#?([a-f0-9]{6}|[a-f0-9]{3})$
- 电子邮箱:^([a-z0-9_.-]+)@([ a-z 0-9.-]+)\.([a-z.]{2,6})$
- URL:^(https?:\/\/)?([0-9a-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$
- IP 地址
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$
- HTML 标签:<(.*)>.*<\/\1>|<(.*) \/>
- 首尾空格:(^\s*)|(\s*$) 或者 /^\s*$/ 匹配空行。
- 去掉所有的行尾空格:“:%s/\s\+$//”。
“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+” 对前面的字符匹配一次或多次;“$”匹配行尾;“//”被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志g。
- 去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。
这回多了“\(”、“\)”、“\n”、“\r”和 “*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次;“\n”代表换行符;“\r”代表回车符;“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。
- 去掉所有的“//”注释:“:%s!\ s*//.*!!”
这里的分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较差低。
- 去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”
“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的 字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。
- 将 data1 data2 修改为 data2 data1::s/\(\w\+\)\s\+\(\w\+\)/\2\t\1
- 将 Doe, John 修改为 John Doe::%s/\(\w\+\), \(\w\+\)/\2 \1/
- 将各行的id字符串替换为行号::%s/\<id\>/\=line(".")
- 将每行开头的单词替换为(行号-10).单词的格式,
如将第11行的word替换成1. word::%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1)
在函数式中可以使用 submatch(1)、submatch(2) 等来引用\1、\2等的内容,而submatch(0)可以引用匹配的整个内容。
- 排序 :/OB/+1,$!sort
三.正则表达式在Linux命令中的使用规则
- vim
文本查找 /pattern
文本替换 :%s/pattern/replacement/g
\a 所有的字母字符. 等同于[a-zA-Z]
\l 小写字母 [a-z]
\L 非小写字母 [^a-z]
\u 大写字母 [A-Z]
\U 非大写字母 [^A-Z]
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
\_. 匹配包含换行在内的所有字符
\{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
\= 匹配一个可有可无的项
\_s 匹配空格或断行
\_[]
- grep
grep –E “pattern” filename
egrep “pattern” filename
grep –Ev “pattern” filename
- sed
文本替换 sed (-i) ‘s/pattern/replacement/g’ filename
删除行 sed (-i) ‘/pattern/ d’ filename
- awk
awk ‘/pattern/’ filename
awk ‘$1 ~ /pattern/’ filename
awk –F ‘pattern’ ‘{print $1}’ filename