正则表达式学习笔记

时间:2021-11-03 09:42:21

/*新手的个人见解,勿以标准作量,-珍惜少年时*/

每天都在学习每天都在更新...

米哥跟我说:“正则表达式说白了就是字符匹配” 以下是我学习当中的笔记。

正则表达式(Regular Expression)是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。

在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。这就是正则的功能!

正则表达式由:定界符、原子、元字符、模式修改符组成。

/\d{4}/:这就是一个简单而又完整的正则

定界符:一般用"//",也可以用别的比如"{}"、"||"

原子:最小的匹配单位,就是我们要找的字符里最小的单位。写在定界符当中。

元字符:修饰原子,拓展原子功能和限定功能。比如“/7{5}/”中{5}就是用来修饰原子7的,{5}就是一个元字符。元字符要写在定界符里面。/7{5}/:的意思是说原子7的旁边必须要有5。

模式修订符号:修饰正则表达式,对模式(正则)修正,卸载定界符的外面。

 

原子

  • 打印字符:也就是我们能够打印出来的字符,能够看得到的。比如0-9,a-z,A-Z,!@.....等等。能够看得到的。注:除了a-z,A-Z,0-9以外的符号尽量加转义符号处理。转义字符能够将有意义的转化为没有意义的,没有意义的转化为有意义的。
  • 非打印字符:比如“回车”,,“tab键”.....等等。

正则表达式函数:preg_match (pattern , subject, matches)

参数 描述
pattern 正则表达式
subject 需要匹配检索的对象
matches 可选,存储匹配结果的数组

与之雷同的函数还有一个preg_match_all,该函数多用的功能就是可以打印所有匹配的,并打印为数组。 

动手写第一个正则:

<?php 
$str="i love pc";
$reg="/pc/";
if(preg_match($reg,$str,$arr)){
echo "正则表达式:<b>{$str}</b>和<b>{$reg}</b>匹配成功</b><br>";
print_r($arr);
}
else{
echo "正则表达式:<b>{$str}</b>没有和<b>{$reg}</b>匹配成功";
print_r($arr);
}
?>
输出:
正则表达式:i love pc/pc/匹配成功
Array ( [0] => pc )

 

元字符

  • ^ 和 \A 表示必须以什么开头,这个必须要写在正则的前面。
  • $ 和 \Z 表示必须以什么结束,这个必须要放在表达式的最后面。

常用的元字符

\b:单词边界,原子的左侧,即为成功,右侧无love单词即为失败。若\blove\b即是两侧。需要 两侧都要有love这个单词才匹配成功。\B与之相反。

<?php 
$str="ilove love pc";
$reg="/\blove/";
if(preg_match($reg,$str)){
echo "匹配成功";
}
else{
echo "匹配失败";
}
?>
输出:
匹配成功

/^abc.*abc$/

表示必须以 abc为开始abc结束中间随意。因为点的意思就是任意的原子,而*则表示任意的次数。

 

一个简单的匹配日期表达式:

/\d{4}-\d{2}-\d{2}/

\d表示匹配的只能是数字,{4}表示匹配的数是四位的,-为连接符。#注:如果想要不限制长度,假设年不是四位数的,是1到5位数的,那么即{1,5}跟数学当中的集合类似。故有正无穷之说。但无负无穷,原因摸摸脚丫子都知道。

字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。
^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“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”。

更多正则表达式全集传送门:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html

 

 模式修订符号

模式修正符 说明
i 表示在和模式进行匹配进不区分大小写
m 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
s 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
x 表示模式中的空白忽略不计
e 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用(讲这个函数时再说)
A 以模式字符串开头,相当于元字符^
Z 以模式字符串结尾,相当于元字符$
U 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式

使用字符i演示如下:

<?php 
$str="this is TEST";
$reg="/test/i";
if(preg_match($reg,$str)){
echo "匹配成功";
}
else{
echo "匹配失败";
}
?>
输出:
匹配成功

使用字符M演示如下:

<?php 
/*****************************Test**1*****************************/
$str1="hello world
abcxishaonian nihao
i love chinakungfu
";
$reg1="/^abc/";
if(preg_match($reg1,$str1,$arr)){
echo "{$reg1}匹配{$str1}成功<br>";
}
else{
echo "{$reg1}匹配{$str1}失败<br>";
}
/***************************Test**2**********************************/
$str2="hello worldabcxishaonian nihao
i love chinakungfu
";
$reg2="/^abc/m";
if(preg_match($reg2,$str2,$arr)){
echo "{$reg2}匹配{$str2}成功<br>";
}
else{
echo "{$reg2}匹配{$str2}成功";
}
?>
输出:
/^abc/匹配hello world abcxishaonian nihao i love chinakungfu失败
/^abc/m匹配hello world abcxishaonian nihao i love chinakungfu成功

 使用字符S演示如下:

<?php 
$str="china HelloWorld kungfu.nihao,halou.meximexi";
$reg="/hello world/i";
if(preg_match($reg,$str)){
echo "案例一匹配成功<br>";
}
else{
echo "案例一匹配失败<br>";
}
$str2="china HelloWorld kungfu.nihao,halou.meximexi";
$reg2="/hello world/ix";
if(preg_match($reg2,$str2)){
echo "案例二匹配成功<br>";
}
else{
echo "案例二匹配失败";
}

?>
输出:
案例一匹配失败
案例二匹配成功

 使用字符U演示如下:

<?php 
$str="<b>你好,世界</b>,劝君珍惜少年时。<b>hello world</b>";
$reg="/\<b\>.*\<\/b\>/U";
if(preg_match_all($reg,$str,$arr)){
echo "{$reg}匹配成功{$str}<br>";
}
else{
echo "{$reg}匹配失败{$str}<br>";
}
$str2="<B>你好,世界</b>,劝君珍惜少年时。<b>hello world</B>";
$reg2="/\<b\>.*?\<\/b\>/i";
if(preg_match_all($reg2,$str2,$arr)){
echo "{$reg2}匹配成功{$str2}<br>";
}
else{
echo "{$reg2}匹配失败{$str2}<br>";
}
?>
输出:
/\<b\>.*\<\/b\>/U匹配成功你好,世界,劝君珍惜少年时。hello world
/\<b\>.*?\<\/b\>/i匹配成功你好,世界,劝君珍惜少年时。hello world

从中看得出来,字符U的效果跟.*?的作用是一样的。建议使用.*?因为U在部分的脚本里面不兼容

 

/*

关于正则的一些资料:

正则表达式的优先级:http://www.cnblogs.com/xishaonian/p/6089644.html

正则表达式的案例URL的匹配:http://www.cnblogs.com/xishaonian/p/6089638.html

待更新.....

*/