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

正则表达式语法实例详解的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  4. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  5. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  6. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  7. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  8. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  9. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

  10. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部