本文将详细的介绍正则表达式语法讲解,采用了通用Perl 正则表达式语法,通过PHP语法编写了实例。 通过此文,可以学习到如何写出需求所需要的正则,并且读懂看似神秘复杂的正则表达式。
- 什么是正则表达式?
- 如何学习正则表达式?
- 正则表达式的组成
- 正则表达式语法
什么是正则表达式
1、正则表达式是一个匹配模式
2、正则表达式是一个字符串,字符串中有一些语法规则,特殊符号
正则表达式是一个字符串,配合对应的函数使用(分隔函数,替换函数等)
如何学习正则表达式
1、我们要学习正则表达式如何编写?
2、函数如何使用?
正则表达式的组成
正则表达式由四部分组成:定界符、原子、元字符、模式修正符。
- 定界符: //,{},|| 。(多种都可以,常用 “//”)
- 原子:最小的匹配单位(放在定界符中),在一个表达式中至少有一个原子。
元字符:用来修饰原子的,用来扩展原子功能和限定原子功能(写在定界符中)
$reg = "/w{3}/";
// w 为原子,{3}为原子修饰符,表示w数量为3,www.baidu.com中www将被匹配模式修正符:对模式(正则)进行修正,写在定界符外面
$reg = "/a{5}/i";
//i 为模式修正符,意为:不区分大小写。此时该模式匹配时,将不区分大小写
正则表达式语法
原子
1. 原子可以分为打印字符和非打印字符
打印字符即能从键盘上进行输入的。(a-z A-Z 0-9 !@#$%…), 非打印字符指的是空格、换行、Tab等。
2. 所有的数字、所有的字、所有的空白、特殊符号的表达
语法 | 意义 |
---|---|
. | 除终止符外的任何字符 |
\d | 所有数字 |
\D | 所有非数字 |
\w | 代表任一个字 a-z,A-Z,0-9,_ |
\W | 代表任一个非字,除了a-z,_之外的所有字符 |
\s | 代表空白 |
\S | 代表非空白 |
3.自定义原子表(重要)
“[ ]” 定义了一个系列原子
①、[13579] : 1,3,5,7,9 皆可匹配。
②、[^a-zA-z] : 非字,^在原子表中表示 非,排除,注意与元字符 ^ 区分,“-”表示从什么到什么;
③、 “.”: 可以代表所有原子
元字符
元字符不能单独出现,是用来修饰原子的。
元字符 | 意义 |
---|---|
* | 用来修饰前面的原子,可以出现0,1,或多个 |
+ | 用来修饰前面的原子,可以出现一次或多次,至少出现一次 |
? | 用来修饰前面的原子,可以出现 0次 或者 1次 |
{n} | n:为原子出现的次数,{3}:限制前面的原子出现3次 |
{m,n} | m=1,n=2,限制原子出现次数的范围,包含m,n的值 |
{m,} | 限制原子最少出现的次数,{3,}:最少出现3次 |
{,n} | 限制原子最多出现的次数,{,3}:最多出现3次 |
a|b | | 表示或者的意思,优先级最低,匹配左侧或者右侧的内容 |
^和 \A | 表示必须以什么开始,写在表达式的前面,/^blog/或/\Ablog/以blog开始 |
$ 和 \Z | 表示必须以什么结束,必须写在表达式的后面 |
\b | 单词边界 |
\B | 非单词边界 |
举个栗子:
实例①:
/^abc$/
: 以abc开始 ,并以abc结束,同时这样的表达式标识了中间不能有其他字符,意味着,这个表达式只能匹配 “abc”
/^abc.*abc$/
: 此表达式,便可匹配 以abc字符开始,已abc字符结束的字符串,比如说“abcdjalffajabc”
. 点 代表所有原子,*代表任意个
实例②:
this is island
/\bis\b/
: 匹配的是 is
/\Bis\b/
: 匹配的是this 中的is
/\bis\B/
: 匹配的是 island 中的is
补充: (转义符号 “\”)
- 将有意义的符号变成普通原子: “\*” 转义*符号
小括号作用
改变原子的优先级
$str = "13579335798888234656789";
$reg = "/(my|your)blog/";
if (preg_match($reg,$str,$arr)){
echo "<pre>";
echo "正则<b>{$reg}</b>,和字符串<b>{$str}</b>匹配成功<br/>";
print_r($arr);
echo "</pre>";
} else {
echo "匹配失败";
}
//此时myblog 和 yourblog将都能匹配
小原子变大原子
$str = "this is a MysqL";
$reg = "/MysqL*/"; // 此时匹配的 MysqLllllllllll
$reg2 = "/(MysqL)*/";// 此时匹配的 MysqL 多个重复
子模式
整个表达式是一个大的模式,小括号中是独立的子模式,都可以将内容匹配出来。
反向引用
使用前面的子模式 \1:表示第一个子模式,\2 表示第二个子模式
$str = "2017/01/10"; $reg = "/\d{4}(-|\/)\d{2}\\1\d{2}";
\1 表示 和 第一个子模式匹配结果保持一致 ?:取消子模式。这样则可以匹配:2017/01/12 或 2017-01-12,但是不能匹配 2017-01/12
模式修正符
模式修正符可以修正表达式的解释,扩充了表达式的功能
①模式修正符,是用来修正整个模式的,要放在模式的外面,放在定界符的右边。
$reg = "/go*gle/i";// i 表示不区分大小写
②模式修正符,一个字符就是一个功能,可以组合使用
$reg = "/go*gle/ieu";
常用的模式修正符
语法 | 意义 |
---|---|
i | 不区分大小写 |
m | 修正表达式可以视为多行,在使用^(已什么开始)或$(以什么结束),每一行都可以满足 |
s | 修正正则表达式中,元字符“.”可以匹配空格 |
x | 修正表达式可以忽略空白 |
e | 可以执行替换内容中的函数(strtoUpper(”\$1$2”)) |
U | 不建议使用,和Perl不兼容,“.*?”代替,取消贪婪(匹配的值不是默认的重复) |
举个栗子:
实例①(修正符 m 的使用):
$str = "this is a Test abc123456";
$reg = "/^abc/m"; //加上修正符m后便可匹配该字符串
实例②(贪婪,使用*?取消贪婪)
贪婪: 匹配的值不是默认的重复
$str = "th<b>is</b> is <b>a</b> demo";//打算匹配出this中is
$reg = "/<b>.*?<\/b>/is"; //取消贪婪后,匹配出this中的is
$reg = "/<b>.*<\/b>/is";//若未取消贪婪,则匹配的是 is is a,取出了一段。
补充:
通过对语法的学习,我们基本上,可以根据需求,一步一步的优化,写出我们想要的正则表达式。并且能够大似看懂正则表达式的意思。(读比写要有难度)
其实,我们平常所需要正则也不需要我们去自己写,可以借鉴网上成熟的正则表达式。
文档是我在看PHP视频的时候,做的笔记然后进行了个整理,喜欢就支持一下吧~
下一章节,我将写一下,正则表达式函数的使用。