红联Linux门户
Linux帮助

linux 正则表达式深度解析?????????

发布时间:2010-02-02 13:50:39来源:红联作者:asan2009
[align=center]正则表达式说明[/align]

简介

大体来讲,正则表达式的文法分为[font=Calibri]3[/font][font=宋体]种标准:[/font][font=Calibri]BRE[/font][font=宋体]、[/font][font=Calibri]ERE [/font][font=宋体]和 [/font][font=Calibri]ARE[/font][font=宋体]。其中 [/font][font=Calibri]BER [/font][font=宋体]和 [/font][font=Calibri]ERE [/font][font=宋体]属于 [/font][font=Calibri]POSIX [/font][font=宋体]标准,[/font][font=Calibri]ARE [/font][font=宋体]则是由各家定义的扩展。 [/font]

POSIX [font=宋体]正则表达式[/font]

传统上,[font=Calibri]POSIX [/font][font=宋体]定义了两种正则表达式语法, 即:基本正则表达式([/font][font=Calibri]BRE[/font][font=宋体])和扩展正则表[/font]
达式([font=Calibri]ERE[/font][font=宋体])。[/font]

其中, [font=Calibri]BRE [/font][font=宋体]定义的语法符号包括:[/font]

. - [font=宋体]匹配任意一个字符。[/font]
[] - [font=宋体]字符集匹配,匹配方括号中定义的字符集之一。[/font]
[^] - [font=宋体]字符集否定匹配,匹配没有在方括号中定义的字符。[/font]
^ - [font=宋体]匹配开始位置。[/font]
$ - [font=宋体]匹配结束位置。[/font]
\(\) - [font=宋体]定义子表达式。[/font]
\n - [font=宋体]子表达式向前引用,[/font][font=Calibri]n [/font][font=宋体]为 [/font][font=Calibri]1-9 [/font][font=宋体]之间的数字。 由于此功能已超出正则语义,需[/font]
要在字符串中回溯,因此需要使用 [font=Calibri]NFA [/font][font=宋体]算法进行匹配。[/font]
* - [font=宋体]任意次匹配(零次或多次匹配)。[/font]
\{m,n\} - [font=宋体]至少 [/font][font=Calibri]m [/font][font=宋体]次,至多 [/font][font=Calibri]n [/font][font=宋体]次匹配;[/font][font=Calibri]\{m\} [/font][font=宋体]表示 [/font][font=Calibri]m [/font][font=宋体]次精确匹配;[/font][font=Calibri]\{m,\} [/font][font=宋体]表示至少 [/font][font=Calibri]m[/font]
次匹配。

ERE [font=宋体]修改了 [/font][font=Calibri]BRE [/font][font=宋体]中的部分语法,并增加了以下语法符号:[/font]

? - [font=宋体]最多一次匹配(零次或一次匹配)。[/font]
+ - [font=宋体]至少一次匹配(一次或更多次匹配)。[/font]
| - [font=宋体]或运算,其左右操作数均可以为一个子表达式。[/font]

同时,[font=Calibri]ERE [/font][font=宋体]取消了子表达式 [/font][font=Calibri]"()" [/font][font=宋体]和 次数匹配 [/font][font=Calibri]"{m,n}" [/font][font=宋体]语法符号的转义符引用语法,在[/font]
使用这两种语法符号时,不在需要添加转义符。 与此同时, [font=Calibri]ERE [/font][font=宋体]也取消了非正则语义的[/font]
子表达式向前引用能力。

BRE [font=宋体]和 [/font][font=Calibri]ERE [/font][font=宋体]共享同样的 [/font][font=Calibri]POSIX [/font][font=宋体]字符类定义。同时,它们还支持字符类比较操作 [/font][font=Calibri]"[. .]"[/font]
和字符来等效体 [font=Calibri]"[= =]" [/font][font=宋体]操作,但很少被使用。[/font]

f / fr / wfr / bwfr [font=宋体]等工具默认使用 [/font][font=Calibri]ERE [/font][font=宋体]模式,同时支持以下 [/font][font=Calibri]perl [/font][font=宋体]风格的字符类:[/font]

POSIX [font=宋体]类 [/font][font=Calibri]perl[/font][font=宋体]类 描述[/font]
----------------------------------------------------------------------------
[:alnum:] [font=宋体]字母和数字[/font]
[:alpha:] \a [font=宋体]字母[/font]
[:lower:] \l [font=宋体]小写字母[/font]
[:upper:] \u [font=宋体]大写字母[/font]
[:blank:] [font=宋体]空白字符(空格和制表符)[/font]
[:space:] \s [font=宋体]所有空格符(比[/font][font=Calibri][:blank:][/font][font=宋体]包含的范围广)[/font]
[:cntrl:] [font=宋体]不可打印的控制字符(退格、删除、警铃[/font][font=Calibri]...[/font][font=宋体])[/font]
[:digit:] \d [font=宋体]十进制数字[/font]
[:xdigit:] \x [font=宋体]十六进制数字[/font]
[:graph:] [font=宋体]可打印的非空白字符[/font]
[:print:] \p [font=宋体]可打印字符[/font]
[:punct:] [font=宋体]标点符号[/font]

- [font=宋体]此外,还有以下特殊字符类:[/font]

perl[font=宋体]类 等效[/font][font=Calibri]POSIX[/font][font=宋体]表达式 描述[/font]
----------------------------------------------------------------------------
\o [0-7] [font=宋体]八进制数字[/font]
\O [^0-7] [font=宋体]非八进制数字[/font]
\w [[:alnum:]_] [font=宋体]单词构成字符[/font]
\W [^[:alnum:]_] [font=宋体]非单词构成字符[/font]
\A [^[:alpha:]] [font=宋体]非字母[/font]
\L [^[:lower:]] [font=宋体]非小写字母[/font]
\U [^[:upper:]] [font=宋体]非大写字母[/font]
\S [^[:space:]] [font=宋体]非空格符[/font]
\D [^[:digit:]] [font=宋体]非数字[/font]
\X [^[:xdigit:]] [font=宋体]非十六进制数字[/font]
\P [^[:print:]] [font=宋体]非可打印字符[/font]

- [font=宋体]还可以使用以下特殊字符换码序列:[/font]

\r - [font=宋体]回车[/font]
\n - [font=宋体]换行[/font]
\b - [font=宋体]退格[/font]
\t - [font=宋体]制表符[/font]
\v - [font=宋体]垂直制表符[/font]
\" - [font=宋体]双引号[/font]
\' - [font=宋体]单引号[/font]



高级正则表达式

除了 [font=Calibri]POSIX BRE [/font][font=宋体]和 [/font][font=Calibri]ERE [/font][font=宋体]之外,[/font][font=Calibri]libutilitis [/font][font=宋体]还支持与[/font][font=Calibri]TCL 8.2[/font][font=宋体]兼容的高级正则表达式语[/font]
法([font=Calibri]ARE[/font][font=宋体])。 通过为 [/font][font=Calibri]stRegEx [/font][font=宋体]参数增加前缀 [/font][font=Calibri]"***:" [/font][font=宋体]就可以开启 [/font][font=Calibri]ARE [/font][font=宋体]模式,这个前缀覆[/font]
盖 [font=Calibri]bExtended [/font][font=宋体]选项。基本上讲,[/font][font=Calibri]ARE [/font][font=宋体]是 [/font][font=Calibri]ERE [/font][font=宋体]的超集。 它在 [/font][font=Calibri]ERE [/font][font=宋体]的基础上进行了如下几[/font]
项扩展:

1. [font=宋体]支持[/font][font=Calibri]"[/font][font=宋体]懒惰匹配[/font][font=Calibri]"[/font][font=宋体](也叫[/font][font=Calibri]"[/font][font=宋体]非贪婪匹配[/font][font=Calibri]"[/font][font=宋体]或[/font][font=Calibri]"[/font][font=宋体]最短匹配[/font][font=Calibri]"[/font][font=宋体]):在 [/font][font=Calibri]'?', '*', '+' [/font][font=宋体]或 [/font][font=Calibri]'{m,n}'[/font]
后追加 [font=Calibri]'?' [/font][font=宋体]符号就可以启用最短匹配,使得该正则表达式子句在满足条件的前提下匹[/font]
配尽可能少的字符(默认是匹配尽可能多的字符)。例如:将 [font=Calibri]"a.*b" [/font][font=宋体]作用于 [/font][font=Calibri]"abab"[/font]
时,将匹配整个串([font=Calibri]"abab"[/font][font=宋体]),若使用 [/font][font=Calibri]"a.*?b"[/font][font=宋体],则将只匹配前两个字符([/font][font=Calibri]"ab"[/font][font=宋体])。[/font]

2. [font=宋体]支持子表达式的向前引用匹配:在 [/font][font=Calibri]stRegEx [/font][font=宋体]中,可以使用 [/font][font=Calibri]'\n' [/font][font=宋体]向前引用曾经定义的[/font]
子表达式。如:[font=Calibri]"(a.*)\1" [/font][font=宋体]可匹配 [/font][font=Calibri]"abcabc" [/font][font=宋体]等。[/font]

3. [font=宋体]无名子表达式:使用 [/font][font=Calibri]"(?:[/font][font=宋体]表达式[/font][font=Calibri])" [/font][font=宋体]的方式创建一个无名表达式, 无名表达式不返回[/font]
到一个 [font=Calibri]'\n' [/font][font=宋体]匹配。[/font]

4. [font=宋体]向前预判:要命中匹配,必须向前满足指定条件。 向前预判分为肯定预判和否定预判[/font]
两种。肯定预判的语法为:[font=Calibri]"(?=[/font][font=宋体]表达式[/font][font=Calibri])"[/font][font=宋体],例如:[/font][font=Calibri]"bai.*(?=yang)" [/font][font=宋体]匹配 [/font][font=Calibri]"bai yang"[/font]
中的前四个字符([font=Calibri]"bai "[/font][font=宋体]),但在匹配时保证字符串在 [/font][font=Calibri]"bai.*" [/font][font=宋体]后必须包含 [/font][font=Calibri]"yang".[/font]
否定判断的语法为:[font=Calibri]"(?![/font][font=宋体]表达式[/font][font=Calibri])"[/font][font=宋体], 例如:[/font][font=Calibri]"bai.*(?!yang)" [/font][font=宋体]匹配 [/font][font=Calibri]"bai shan" [/font][font=宋体]的前[/font]
四个字符,但在匹配是保证字符串在 [font=Calibri]"bai.*" [/font][font=宋体]后不出现 [/font][font=Calibri]"yang"[/font][font=宋体]。[/font]

5. [font=宋体]支持模式切换前缀,在 [/font][font=Calibri]"***:" [/font][font=宋体]之后可以紧跟形如 [/font][font=Calibri]"(?[/font][font=宋体]模式串[/font][font=Calibri])" [/font][font=宋体]样式的模式串,模式[/font]
串影响其后表达式的语义和行为。模式串可以是一下字符的组合:

b - [font=宋体]切换至 [/font][font=Calibri]POSIX BRE [/font][font=宋体]模式,覆盖 [/font][font=Calibri]bExtended [/font][font=宋体]选项。[/font]
e - [font=宋体]切换至 [/font][font=Calibri]POSIX ERE [/font][font=宋体]模式,覆盖 [/font][font=Calibri]bExtended [/font][font=宋体]选项。[/font]
q - [font=宋体]切换至文本字面匹配模式, 表达式中的字符都作为文本进行搜索,取消一切正则[/font]
语义。此模式将正则匹配退化为一次简单字符串查找。[font=Calibri]"***=" [/font][font=宋体]前缀是其快捷表示[/font]
方式,意即:[font=Calibri]"***=" [/font][font=宋体]等同于 [/font][font=Calibri]"***:(?q)"[/font][font=宋体]。[/font]

c - [font=宋体]执行大小写敏感的匹配,覆盖 [/font][font=Calibri]bNoCase [/font][font=宋体]选项。[/font]
i - [font=宋体]执行忽略大小写的匹配,覆盖 [/font][font=Calibri]bNoCase [/font][font=宋体]选项。[/font]

n - [font=宋体]开启行敏感的匹配:[/font][font=Calibri]'^' [/font][font=宋体]和 [/font][font=Calibri]'$' [/font][font=宋体]匹配行首和行尾;[/font][font=Calibri]'.' [/font][font=宋体]和否定集([/font][font=Calibri]'[^...]'[/font][font=宋体])不[/font]
匹配换行符。此功能等同于 [font=Calibri]'pw' [/font][font=宋体]模式串。覆盖 [/font][font=Calibri]bNewLine [/font][font=宋体]选项。[/font]
m - [font=宋体]等同于 [/font][font=Calibri]'n'[/font][font=宋体]。[/font]
p - '^' [font=宋体]和 [/font][font=Calibri]'$' [/font][font=宋体]只匹配整个字符串的首尾,不匹配行;[/font][font=Calibri]'.' [/font][font=宋体]和否定集不匹配换行符。[/font]
覆盖 [font=Calibri]bNewLine [/font][font=宋体]选项。[/font]
w - '^' [font=宋体]和 [/font][font=Calibri]'$' [/font][font=宋体]匹配行首和行尾;[/font][font=Calibri]'.' [/font][font=宋体]和否定集匹配换行符。覆盖 [/font][font=Calibri]bNewLine [/font][font=宋体]选项。[/font]
s - '^' [font=宋体]和 [/font][font=Calibri]'$' [/font][font=宋体]只匹配整个字符串的首尾,不匹配行;[/font][font=Calibri]'.' [/font][font=宋体]和否定集匹配换行符。覆[/font]
盖 [font=Calibri]bNewLine [/font][font=宋体]选项。[/font][font=Calibri]ARE [/font][font=宋体]状态下默认使用此模式。[/font]

x - [font=宋体]开启扩展模式:在扩展模式中,将忽略表达式中的空白符和注释符 [/font][font=Calibri]'#' [/font][font=宋体]后的内容[/font]
例如:
@code@
(?x)
\s+ ([[:graph:]]+) # first number
\s+ ([[:graph:]]+) # second number
@code@
等同于 [font=Calibri]"\s+([[:graph:]]+)\s+([[:graph:]]+)"[/font][font=宋体]。[/font]
t - [font=宋体]关闭扩展模式,不忽略空白符和注释符后的内容。[/font][font=Calibri]ARE [/font][font=宋体]状态下默认使用此模式。[/font]

6. [font=宋体]与 [/font][font=Calibri]BRE/ERE [/font][font=宋体]模式不同的 [/font][font=Calibri]Perl [/font][font=宋体]风格字符类换码序列:[/font]

perl[font=宋体]类 等效[/font][font=Calibri]POSIX[/font][font=宋体]表达式 描述[/font]
----------------------------------------------------------------------------
\a - [font=宋体]响铃字符[/font]
\A - [font=宋体]不论当前模式如何,仅匹配整个串的最开头[/font]
\b - [font=宋体]退格字符 [/font][font=Calibri]('\x08')[/font]
\B - [font=宋体]转义字符本身 [/font][font=Calibri]('\\')[/font]
\cX - [font=宋体]控制符[/font][font=Calibri]-X (= X & 037)[/font]
\d [[:digit:]] 10 [font=宋体]进制数字 [/font][font=Calibri]('0' - '9')[/font]
\D [^[:digit:]] [font=宋体]非数字[/font]
\e - [font=宋体]退出符 [/font][font=Calibri]('\x1B')[/font]
\f - [font=宋体]换页符 [/font][font=Calibri]('\x0C')[/font]
\m [[:<:]] [font=宋体]单词开始位置[/font]
\M [[:>:]] [font=宋体]单词结束位置[/font]
\n - [font=宋体]换行符 [/font][font=Calibri]('\x0A')[/font]
\r - [font=宋体]回车符 [/font][font=Calibri]('\x0D')[/font]
\s [[:space:]] [font=宋体]空白符[/font]
\S [^[:space:]] [font=宋体]非空白符[/font]
\t - [font=宋体]制表符 [/font][font=Calibri]('\x09')[/font]
\uX - 16 [font=宋体]位 [/font][font=Calibri]UNICODE [/font][font=宋体]字符 [/font][font=Calibri](X[/font]∈[0000 .. FFFF])
\UX - 32 [font=宋体]位 [/font][font=Calibri]UNICODE [/font][font=宋体]字符 [/font][font=Calibri](X[/font]∈[00000000 .. FFFFFFFF])
\v - 纵向制表符 [font=Calibri]('\x0B')[/font]
\w [[:alnum:]_] [font=宋体]组成单词的字符[/font]
\W [^[:alnum:]_] [font=宋体]非单词字符[/font]
\xX - 8 [font=宋体]位字符 [/font][font=Calibri](X[/font]∈[00 .. FF])
\y - 单词边界([font=Calibri]\m [/font][font=宋体]或 [/font][font=Calibri]\M[/font][font=宋体])[/font]
\Y - [font=宋体]非单词边界[/font]
\Z - [font=宋体]不论当前模式如何,仅匹配整个串的最尾部[/font]
\0 - NULL[font=宋体],空字符[/font]
\X - [font=宋体]子表达式向前引用 [/font][font=Calibri](X[/font]∈[1 .. 9])
\XX - [font=宋体]子表达式向前引用或 [/font][font=Calibri]8 [/font][font=宋体]进制表示的 [/font][font=Calibri]8 [/font][font=宋体]字符[/font]
\XXX - [font=宋体]子表达式向前引用或 [/font][font=Calibri]8 [/font][font=宋体]进制表示的 [/font][font=Calibri]8 [/font][font=宋体]字符[/font]
文章评论

共有 3 条评论

  1. flzy110 于 2010-02-02 20:24:18发表:

    努力学习。

  2. zhangbohtz 于 2010-02-02 18:25:41发表:

    过去了就是开阔地!

  3. 火山 于 2010-02-02 16:05:13发表:

    够吓人的