您的位置:首页 > 运维架构 > Shell

shell-正则表达式

2014-11-21 20:23 218 查看
说到正则表达式,先了解一下shell中的查找功能:

grep 使用POSIX定义的基本正则表达式

egrep 扩展式grep,功能更强大的正则表达式

fgrep 快速grep,匹配固定的字符串而非正则表达式

grep

-E 可替代传统的egrep

-F 可替代传统的fgrep

-e pat-file

-f pat-file

-i 模式匹配忽略字母大小写差异

-l 列出匹配模式的文件名称,而不是打印匹配的行

-q 如果匹配成功,grep会成功地离开,不将匹配的行写入标准输出,否则就是不成功

-s 不显示错误信息,通常和-q并用

-v 显示不匹配模式的行

grep [options] pattern-spec [files]

正则表达式

正则表达式是一个字符或和元字符组合成的字符集,他们匹配一个模式。字符即普通字符,元字符即特殊字符。

一个正则表达式包含下面一个或多个

1.字符集

2.锚 指明了正则表达式在一行文本中要匹配的位置,例如^和$

3.修饰符 用于展开或缩小正则表达式匹配文本行的范围,如:星号,括号,反斜杠

重复字符:-----------------------------------

* 匹配重复0次或多次字符

+ 匹配1个或多次字符

? 匹配0或1个次字符

{n} 匹配n次

{n,} 匹配n次或多次

{n,m} 匹配n到m次

元字符::-----------------------------------

^ 匹配一行的开头或补集

$ 匹配一行的结尾

^\d{5,12}$ 匹配5-12个数字

也可以用来匹配行的开头和结尾

\b 匹配单词的开头或结尾 \bhi\b 只会匹配hi, 不会匹配him这种

.* 匹配任意数量的不包含换行的字符

\d 匹配数字

\w 匹配字符或数字或下划线或汉字

\s 匹配任意的空白字符

. 匹配除了换行符外的任意字符

分支条件: ”|“

\d{5}-\d{4} | \d{5} 匹配00000-0000或00000数字

如果第一条件满足就不再理第二条件

反义:

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了x以为任意的字符

[^adiou]
匹配除了aeiou这几个字母以为的任意字符

后向引用:

用于重复搜索前面某个分组匹配的文本。

使用小括号指定一个子表达式,匹配这个子表达式的文本可以在表达式或其他程序中做进一步的处理,默认情况下,每个分组会自动拥有一个组号,规则是从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

也可以自己指定子表达式的组名,(?<Word>\w+)把\w+的组名指定为Word,要反向引用这个分组,可以用\k<Word>

捕获:

(exp) 匹配exp,自动命名

(?<name>exp)
匹配exp,命名为name

(?:exp)
匹配exp,不捕获匹配的文本,也不分配组号

零宽断言:

(?=exp)
匹配exp前面的位置

(?<=exp)
匹配exp后面的位置

(?!exp)
匹配后面跟的不是exp的位置

(?<!exp)
匹配前面不是exp的位置

例子:

(?<=<(\w+)>).*(?=<\/\1>) 匹配HTML标签<b>...</b>

注释:

(?#comment)

贪婪与懒惰:

当表达式中包含能接受重复的限定符时,通常的行为时匹配尽可能多的字符,如a.*b,它会匹配最长的以a开头,b结束的字符,这成为贪婪

想发。懒惰的匹配就是匹配尽可能少的字符,,只要在表达式后面加上一个?,就可以实现懒惰的匹配。

比贪婪和懒惰优先级更高的是:最开始的匹配拥有最高的优先权,如: a.*?b 匹配 aabab 先匹配aad 再匹配ab

*? 重复任意次,但尽可能少重复

+? 重复1次或更多次,但尽可能少重复

?? 重复0次或1次,但尽可能少重复

{n,m}?
重复n到m次,但尽可能少重复

{n,}?
重复n次以上, 但尽可能少重复
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: