
1.正则表达式基础知识
含义:由普通字符和(a-z)和一些特殊字符组成的字符串模式
功能:有效性验证。
替换文本。
从一个字符串提取一个子字符串。
分类:POSIX和Perl
POSIX风格更容易掌握,但不能用于二进制模式,而perl相对比较复杂。
2.POSIX风格的正则表达式
1.编写正则表达式
表4.3 POSIX正则表达式语法格式列表
字 符
描 述
转义字符,用于转义特殊字符。例如,.匹配单个字符,.匹配一个点号。-匹配连字符-,\匹配符号
^
匹配输入字符串的开始位置。例如^he表示以he开头的字符串
$
匹配输入字符串的结束位置。例如,ok$表示以ok结尾的字符串
*
匹配前面的子表达式零次或多次。例如,zo*能匹配”z”以及”zoo”。*等价于{0,}
匹配前面的子表达式一次或多次。例如,zo 能匹配”zo”以及”zoo”,但不能匹配”z”。 等价于{1,}
?
匹配前面的子表达式零次或一次。例如,do(es)?可以匹配”do”或”does”中的”do”。?等价于{0,1}
{n}
n是一个非负整数。匹配确定的n次。例如,o{2}不能匹配”Bob”中的o,但是能匹配”food” 中的两个o
{n,}
n是一个非负整数。至少匹配n次。例如,o{2,}不能匹配”Bob”中的o,但能匹配”foooood” 中的所有o。o{1,}等价于o 。o{0,}则等价于o*
{n,m}
m和n均为非负整数,其中n≤m。最少匹配n次且最多匹配m次。例如,”o{1,3}”将匹配”fooooood”中的前三个o。o{0,1}等价于o?。请注意在逗号和两个数之间不能有空格
?
当该字符紧跟在任何一个其他限制符(*, , ?, {n}, {n,}, {n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串”oooo”,o ?将匹配单个”o”,而o 将匹配所有o
.
匹配除”n”之外的任何单个字符,要匹配包括n 在内的任何字符,可以使用[.n]的模式
(pattern)
匹配pattern并获取这一匹配。所获取的匹配保存到相应的数组中。要匹配圆括号字符,请使用 ( 或 )
(?:pattern)
匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储。这在使用”或”|”来组合一个模式的各个部分时很有用。例如,industr(?:y|ies).就是一个比industry|industries更简略的表达式
(?=pattern)
正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,Windows(?=95|98|NT|2000)能匹配”Windows 2000″中的”Windows”,但不能匹配”Windows 3.1″中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
(?!pattern)
负向预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如Windows(?!95|98|NT|2000)能匹配”Windows 3.1″中的”Windows”,但不能匹配”Windows 2000″中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y
匹配x或y。例如,z|food 能匹配”z”或”food”,(z|f)ood则匹配”zood”或”food”
[xyz]
字符集合。匹配所包含的任意一个字符。例如,[abc]可以匹配”plain”中的a
[^xyz]
负值字符集合。匹配未包含的任意字符。例如,[^abc]可以匹配”plain”中的p
[a-z]
字符范围。匹配指定范围内的任意字符。例如,[a-z]可以匹配a到z 范围内的任意小写字母字符
[^a-z]
负值字符范围。匹配不在指定范围内的任意字符。例如,[^a-z]可以匹配不在a 到z范围内的任意字符
以下是几个简单的正则表达式的例子:
●[A-Za-z0-9] :表示所有的大写字母、小写字母及0到9的数字。
●^hello:表示以hello开始的字符串。
●world$:表示以world结尾的字符串。
●.at:表示以除”n”外的任意单个字符开头并以”at”结尾的字符串,如”cat”、”nat”等。
●^[a-zA-Z]:表示一个以字母开头的字符串。
●hi{2}:表示字母h后跟着两个i即hii。
●(go) :表示至少含有一个go字符串的字符串,如gogo
身份证号码一般由18位数字或17位数字后面加一个X或Y字母组成,要匹配身份证号码,可以写作:
^[0-9]{17}([0-9]|X|Y)$
Email地址的正则表达式可以写作:
^[a-zA-Z0-9-] @[a-zA-Z0-9-] .[a-zA-Z0-9-.] $
2.字符串的匹配
ereg()和eregi()函数
使用ereg()函数可以查找字符串与子字符串匹配的情况,并返回匹配字符串的长度,还可以借助参数返回匹配字符的数组。语法格式如下:
int ereg(string ($pattern) , string $string [, array $regs ])
/*本例检查字符串是否是ISO格式的日期(YYYY-MM-DD) */
$date=”1988-08-09″;
$len=ereg (([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}), $date, $regs);//日期格式为YYYY-MM-DD
if ($len)
{
echo “$regs[3].$regs[2].$regs[1]”. “”; //输出”09.08.1988″
echo $regs[0] .””; //输出”1988-08-09″
echo $len; //输出10
}
else
{
echo “错误的日期格式: $date”;
}
?



