正则表达式入门

来源:互联网 发布:儒道数据分析地址 编辑:程序博客网 时间:2024/06/08 16:51

正则表达式入门

要谈论正则表达式,就得先了解一下POSIX。POSIX的全称是PortableOperating System Interface for uniX,它由一系列规范构成,定义了UNIX操作系统应当支持的功能,它定义了BRE(Basic Regular Expression,基本型正则表达式)和ERE(Extended Regular Express,扩展型正则表达式)两大流派。

  正则表达式由只代表自身的字面值和代表特定含义的元字符组成,除非特别说明,正则表达式严格区分大小写。正则表达式的大致匹配过程是:

1.依次拿出表达式和文本中的字符比较,

2.如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

3.如果表达式中有量词或边界,遵循量词或边界指定的规则来匹配。

扩展正则表达式与基础正则表达式的区别在于:? + () {} 这几个字符。

基础正则表达式中,如果你想? + () {}表示特殊含义,你需要将他们转义

而扩展正则表达式中,如果你想? + () {} 不表示特殊含义,你需要将他们转义。

所谓特殊含义,就是正则表达式中的含义。非特殊含义,就是这个符号本身。

+,和*中大家会遇到贪婪模式的说法,也有称最长匹配原则,本质就是趋向于最大长度匹配,

基本正则表达式(BRE)

字符匹配

(匹配的时候需要使用两个方括号,如[[ :alpha:]])

.  表示任意单个字符,.会匹配除了换行符的任意字符

[ ]   表示匹配范围内的任意单个字符

[^ ] 表示匹配范围外的任意单个字符

[:alpha:]  任意一个字母(相当于a-zA-Z)

[:upper:] 任意一个大写字母(相当于A-Z)

[:lower:] 任意一个小写字母(相当于a-z)

[:digit:]  任意一个数字(相当于0-9)

[:space:] 水平和垂直的空白字符(比blank包含的更多)

[:blank:]  空白字符(空格和制表符)

[:punct:] 标点符号

[:alnum:]  任意字母和数字(相当于0-9a-zA-Z)

[:print:]  可打印字符

匹配次数

*   表示*号前面的一个字符的0-N次(它有一个贪婪模式,会尽量匹配最长)

.*   表示任意多个长度的字符

\?   表示\?符号前的字符0-1次

\+    匹配\+前的字符至少1次

\{m,n\}   表示\{m,n\}符号前的字符的m-n次

\{m\}    表示{m\}符号前的字符m次

\{n,\}    表示匹配前面字符至少n次

\{,n}     表示匹配前面字符最多n次

位置锚定

^ 之后接字符    表示^ 之后的字符出现在行首

$ 之前接字符    表示$之前的字符出现在行尾

\> 表示\> 符号之后的字符出现在单词的尾部

\< 表示\< 之前的字符出现在单词的首部

\<字符 \>      表示只有小于号和大于号之间的字符

分组

分组 : \(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如: \(root\)+

后向引用 : 引用前面的分组括号中的模式所匹配字符,而非模式本身

 

或者 : \|

拓展正则表达式(ERE)

字符匹配

.  表示任意单个字符,.会匹配除了换行符的任意字符

[]   匹配指定范围内的任意单个字符

[^]  匹配指定范围外的任意单个字符

[ : alnum : ]   字母和数字

[ : alpha : ]   代表任何英文大小写字符,亦即 A-Z, a-z

[ : lower : ]   小写字母

[ : upper : ]   大写字母

[ : blank : ]   空白字符(空格和制表符)

[ : digit : ]   十进制数字

[ : xdigit : ]  十六进制数字

[ : graph : ]   可打印的非空白字符

[ : print : ]   可打印字符

[ : punct : ]   标点符号

 

匹配次数

*: 匹配前面字符任意次,包括0次

? : 0或1次

+: 1次或多次

{n}  匹配前面的字符n次

{m,n} 匹配前面的字符至少m次,至多n次

{,n} 匹配前面的字符至多n次

{n,} 匹配前面的字符至少n次

位置锚定

^   行首锚定,用于模式的最左侧

 

$   行尾锚定,用于模式的最右侧

 

\< 或 \b     词首锚定,用于单词模式的左侧

 

\> 或 \b     词尾锚定;用于单词模式的右侧

 

\<PATTERN\> 匹配整个单词

分组

():分组,后面可以使用1 ,2 ,3...引用前面的分组

a|b : a或b

优先级

优先级

符号

1

\

2

( )、(?: )、(?= )、[ ]

3

*、+、?、{n}、{n,}、{m,n}

4

^、$

5

|

实战

1找出/etc/rc.d/init.d/functions的基名(basename可以直接获取)。

2 找出/etc/rc.d/init.d/functions的目录名(dirname可以直接获取)。

3 统计last命令中以root用户登录的每个主机IP登录次数。

4 显示ifconfig命令中所有的IPV4地址。

5显示/etc/passwd中以/bin/bash结尾的行。