正则表达式语法实例详解

前端之家收集整理的这篇文章主要介绍了正则表达式语法实例详解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

猜你在找的正则表达式相关文章