重定向

此博客已停止更新,新址: http://blog.scicooking.net


2009年1月15日星期四

Regular Expression (POSIX Extended)

Regular Expression (POSIX Extended)

模式的数学定义
给定集合U,若存在映射F,使得S=F(U)并且S⊆U,则映射F就是集合U上的一个模式(pattern).

介绍

注:从 PHP 5.3 开始这个扩展将被废弃,使用性能更好功能更多的 PCRE (Perl-Compatible Regular Expressions) 扩展。
PCRE 包括非贪婪模式、断言、条件子模式等不被 POSIX-extended 规则表达式 支持的语法。

规则表达式用于复杂的字符串操作。


Metacharacters

扩展规则表达式使用的元字符:
| ^ $ . * + ? ( ) [ ] { } \

. 代表任何单个的字符
^ 不匹配任何字符,用来表示一行的开始。比如 ^A 匹配以 A 字母开头的行。
$ 不匹配任何字符,用来表示一行的结束。比如 A$ 匹配以 A 字母结尾的行。
| 或者表达式
* 任何个数
+ 至少一个
? 最多一个

() 表达式分组

[] 范围,字符集
{} 计数器
\ 转义

[括号表达式]
[]方括号表示单个字符或者集合。比如 [ABC] 匹配任何含 A 或者 B 或者 C 的字符串。
如果方括号中首个字符是 ^ 的话,那么这个表达式表示匹配除了这些指定字符以外的字符串。比如 [^ABC] 将匹配不包含 A 和 B 和 C 的字符串。

[:digit:] 数字 0-9, 等价于 [0-9]
[:xdigit:] 16 进制数字 0-9, A-F, a-f.
[:alnum:] 字符数字 0-9 或者 A-Z 或者 a-z. 等价于 [0-9A-Za-z]
[:alpha:] 字母 A-Z 或者 a-z. 等价于 [A-Za-z]
[:blank:] 空白字符,仅空格、TAB.
[:punct:] Punctuation symbols . , " ' ? ! ; :
[:print:] 任何可打印字符,包括空格.
[:space:] 任何空白字符,空格、tab、换行、回车等.
[:graph:] 可打印字符,除了空格
[:upper:] 大写字母 A-Z. [A-Z]
[:lower:] 小写字母 a-z. [a-z]
[:cntrl:] 任何非打印字符


() 表达式组,会被捕获。
(.*) 0个任何个数任何字符。也就是任何东西!
(n|a) n 或者 a
[^a-z] 除了 a 到 z 之外的任何字符串.
注: ^ 作为例外规则仅在 [] 中的第一个字符位置的时候才起作用。不能用做 ^undesired_word 或者 ^(undesired_phrase)。

[_4^a-zA-Z] 下划线、4、^、大小写字母。这个 ^ 作为普通字符。

n? 0 或者 1 个,最多一个 {0,1}
n* 0 或者更多,任意个 {0,}
n+ 1 个或更多,至少一个 {1,}
n{2} 指定个数
n{2,} 不少于指定个数
n{2,4} 在指定的个数之间

?, +, * and the {} 这些计数参数不仅可用于单个字符,也适用于组()和范围[].

例子:

^.{2}[a-z]{1,2}_?[0-9]*([1-6]|[a-f])[^1-9]{2}a+$

表示:

^.{2} = 任何 2 个字符开头,
[a-z]{1,2} = 跟着 1 个或者 2 个小写字母,
_? = 然后是可选的下划线,
[0-9]* = 接着可能有数字,
([1-6]|[a-f]) = 接着 1 到 6 之间的数字或者 a 到 f 之间的字母,
[^1-9]{2} = 然后是非 1-9 的字符,
a+a+$ = 最后是至少一个 a 结尾.
nbsp; = 最后是至少一个 a 结尾.



正则替换 ereg_replace():

如果使用了分组,那么替换规则中可以用 \数字 引用这些分组。
0 代表匹配到的整个字符串。1-9 按顺序代表分组,最多表示 9 个。
分组可以嵌套,顺序按照开括号顺序计算(也就是最外层的在前)。

例子:
给 URI 字符串加上超链接:
[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]<a href="\0">\0</a>

匹配日期:
([[:digit:]]{4})-[[:digit:]]{2}-[[:digit:]]{2}
([[:digit:]]{4})-([0]?[1-9]|[1][0-2])-([0-2]?[0-9]|[3][0-1])

匹配任何 标签
<[^<>]*>


man regex
http://www.tin.org/bin/man.cgi?section=7&topic=regex
http://www.mkssoftware.com/docs/man5/regexp.5.asp

没有评论: