正则表达式语法实例详解

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值