代码改变世界

常用正则表达式

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,可以写成
gr[ea]y或者grey|gray亦或者gr(e|a)y

另外,若想匹配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个括号所代表的子表达式

 

              

二.常用正则表达式

  1. 查找重复单词:grep –i ‘\<([a-z]+) +\1\>’ files
  2. 删除空行:sed "/^\s*$/d" filename >newfile
  3. 匹配所有:.*
  4. Html和css中的十六进制值:^#?([a-f0-9]{6}|[a-f0-9]{3})$
  5. 电子邮箱:^([a-z0-9_.-]+)@([ a-z 0-9.-]+)\.([a-z.]{2,6})$
  6. URL:^(https?:\/\/)?([0-9a-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$
  7. 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])$

  1. HTML 标签:<(.*)>.*<\/\1>|<(.*) \/>
  2. 首尾空格:(^\s*)|(\s*$) 或者 /^\s*$/  匹配空行。
  3. 去掉所有的行尾空格:“:%s/\s\+$//”。

“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+” 对前面的字符匹配一次或多次;“$”匹配行尾;“//”被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志g。

  1. 去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。

这回多了“\(”、“\)”、“\n”、“\r”和 “*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次;“\n”代表换行符;“\r”代表回车符;“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。

  1. 去掉所有的“//”注释:“:%s!\ s*//.*!!”

这里的分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较差低。

  1. 去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”

“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的 字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。

  1. 将 data1 data2 修改为 data2 data1::s/\(\w\+\)\s\+\(\w\+\)/\2\t\1   
  2. 将 Doe, John 修改为 John Doe::%s/\(\w\+\), \(\w\+\)/\2 \1/    
  3. 将各行的id字符串替换为行号::%s/\<id\>/\=line(".")   
  4. 将每行开头的单词替换为(行号-10).单词的格式,

如将第11行的word替换成1. word::%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1)

在函数式中可以使用 submatch(1)、submatch(2) 等来引用\1、\2等的内容,而submatch(0)可以引用匹配的整个内容。

  1. 排序 :/OB/+1,$!sort

三.正则表达式在Linux命令中的使用规则

  1. 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 匹配空格或断行

\_[]

  1. grep

grep –E “pattern” filename

egrep “pattern” filename

grep –Ev “pattern” filename

  1. sed

文本替换 sed (-i) ‘s/pattern/replacement/g’ filename

删除行 sed (-i) ‘/pattern/ d’ filename

  1. awk

awk ‘/pattern/’ filename

awk ‘$1 ~ /pattern/’ filename

awk –F ‘pattern’ ‘{print $1}’ filename