正则表达式语法实例详解

2017-01-13 11:33:34来源:CSDN作者:shuai_wy人点击

第七城市

本文将详细的介绍正则表达式语法讲解,采用了通用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,A-Z,0-9,_之外的所有字符
/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 修正表达式可以忽略空白
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视频的时候,做的笔记然后进行了个整理,喜欢就支持一下吧~
下一章节,我将写一下,正则表达式函数的使用。


第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台