目录
正则表达式学习(持续更新)" >正则表达式学习(持续更新)
1.什么是正则表达式" >1.什么是正则表达式
2.正则表达式的相关概念" >2.正则表达式的相关概念
3.简单的正则表达式" >3.简单的正则表达式
4.字符转义" >4.字符转义
5.字符类" >5.字符类
6.分枝条件" >6.分枝条件
7.分组" >7.分组
8.反义" >8.反义
9.后向引用" >9.后向引用
10.零宽断言" >10.零宽断言
11.负向零宽断言" >11.负向零宽断言
  在处理字符串匹配问题时,通常的行为是匹配尽可能多的字符。以表达式a.*b和字符串aabab为例,会匹配aabab,而不是匹配ab,这样的匹配规则称为贪婪匹配。" >  在处理字符串匹配问题时,通常的行为是匹配尽可能多的字符。以表达式a.*b和字符串aabab为例,会匹配aabab,而不是匹配ab,这样的匹配规则称为贪婪匹配。
14.处理选项" >14.处理选项
15.平衡组/递归匹配" >15.平衡组/递归匹配
首页 后端开发 php教程 学习正则表达式基础

学习正则表达式基础

Mar 14, 2018 pm 12:52 PM
基础 正则 表达式

本篇文章讲述了JavaScript正则表达式的基础,大家对于JavaScript正则表达式不熟悉的正好可以来学习学习,讲的都是JavaScript比较基础的正则表达式,不熟悉的同学我们一起来看看吧!

正则表达式学习(持续更新)

今天在学javascript的时候学到了RegExp对象,借机学习一下正则表达式,以前没接触过,趁机学习一波,很舒服。

参考网站:正则表达式30分钟入门教程点击打开链接

1.什么是正则表达式

    正则表达式是用来表述字符串匹配的规则。

2.正则表达式的相关概念

2.1元字符

    元字符是正则表达式中自己规定的一种特殊符号,在正则表达式中加入用以代替某些规则。

\b 表示单词的开始或结束
. 表示除换行以外的任意字符
*    表示*前面出现的任意个数的该字符,例如a*,表示前面有任意个数的a(重复0次或多次)
+    表示+前面出现的任意个数的该字符,例如a+,表示前面有任意个数的a(重复1次或多次)
? 重复0或1次                                                                                                                                                                                                  
{n} 重复n次
{n, } 重复大于等于n次
{n, m} 重复n到m次
\d   表示一个0-9的数字                                                                                                                    
\w 匹配字母或数字或下划线或汉字                                                                         
\s 匹配任意的空白符,包括空格、制表符、换行符、中文全角空格等
^ 匹配字符串的开始                                                                           
& 匹配字符串的结束

3.简单的正则表达式

    直接从例子走起:

    例1:当我想去匹配单词hello时,所写的正则表达式(匹配规则)为:hello

    这样会匹配到所有含有hello的单词,如:helloworld也被匹配了进来,但如果只想匹配hello,则需要使用元字符\b,将hello前后断开,形成单独的单词hello,则正则表达式应该为:\bhello\b

    例2:当要找的hello后面任意字符处跟着一个world,则应当使用元字符.和*,正则表达式为\bhello\b.*\world\b

    例3:当想去匹配021-xxxxxxx类似这样的电话号码时,应当使用021-\d\d\d\d\d\d\d,这其中“021-”为简单的字符,不代表任何特殊含义,而后面使用的\d为元字符。这个正则表达式可简写为021-\d{7},代表\d重复了7次。

    例4:匹配1个或多个连续数字,\d+

    例5:匹配以a开头的单词,\ba\w*\b

    例6:匹配5-12位的QQ号,^\d{5, 12}&

4.字符转义

    如果想要查找的字符串里面有元字符,需要在元字符前面加上\来将元字符转为普通的字符。

5.字符类

    这部分解决的问题是如果想要匹配的字符没有相应的元字符对应怎么办,那么我们需要手动创建一个字符类。

    例如如果数字0-9没有\d与之匹配,那么当我们想要查找0-9的任意数字时,可以创建一个[0-9]的字符类,它的作用与\d完全相同。

    例如正则表达式 \(?0\d{2}[), -]?\d{8}可以用来匹配电话号码,依次解释一下\(代表对(进行转义,表示其重复0或1次,\d表示两个数字,[), -]表示)和-的字符类,表示其重复0或1次,后接着有8个数字。

6.分枝条件

    上面写的 \(?0\d{2}[), -]?\d{8}这样的正则表达式可能会匹配到(01012345678或(010-12345678等不正确的字符串,对于这样的情况可以使用分枝条件,分枝条件与js中的逻辑或||类似,并且都是短路操作符,从左到右匹配到一个条件能判断时就结束。

    对于上面的情况可以写为 \(0\d{2}\)\d{8}|0\d{2}-\d{8}|\(0\d{2}\)\d{8}

7.分组

    该部分为了解决重复的不是单个字符,而是多个字符的问题。重复单个字符时我们可以使用字符+元字符里面的限定符这样的写法,但当重复字符为多个时,可以在重复字符外加上()。例如下面的正则表达式可用来表示ip地址。

(2[0-4]\d|25[0-5]|[01]\d\d?\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

8.反义

当需要查找不属于某个能够简单定义的字符时,例如除了xxx以外的字符时,需要用到反义

\W

匹配任意不是字母、数字、下划线、汉字的字符

\D 匹配任意不是数字的字符
\B 匹配任意不是单词开头或结束位置的字符
\S 匹配任意不是空白的字符
[^x] 匹配除了x以外的字符
[^aeiou] 匹配除了aeiou之外的字符

例如正则表达式^\S+&用来匹配一段不含空白符的字符

9.后向引用

    这部分的内容跟前面的分组是匹配的,当我们使用()为字符分组后,这个分组我们可以通过编号的方式在后面继续引用,对于通过()进行的分组,按照( 出现的顺序从1开始进行分组,例如正则表达式\b(\w+)\s+\1\b,可以用来匹配重复出现的单词,例如go go等,这里就是通过\1引用了之前出现的分组。

    其他涉及到的后向引用语法有:

(exp) 匹配exp,并捕获当前内容到自动的分组里                                                                            
(?exp) 匹配exp,并捕获当前内容并分配组名为name
(?:exp) 匹配exp,不为捕获的内容分配组名

10.零宽断言

    用于查找在某部分内容之前或之后但不包括该内容的部分。

    正则表达式(?=exp)的意思就是断言后面出现的部分可以匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分。比如查找I'm dancing and singing时会匹配dance和sing(由于有\w+不会匹配为s)。

    正则表达式(?<=exp)的意思是断言前面的部分可以匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re为开头的单词的后半部分,例如查找reading时会匹配到ading。

假如你想给一个很长的数字每三位加一个逗号,例如对123456789加逗号,可以使用正则表达式((?<=\d)\d{3})+\b,查找结果为234567890(这部分查找规则没看懂。。。)

下面的例子同时使用两种断言(?=<\s)\d+(?=\s),用来匹配两个空白字符之间的数字,不包括空白字符。

总的来看,零宽断言的目的就是为了按照一定的规则确定匹配字符的起始点或终止点。

11.负向零宽断言

前面提到了使用反义来查找不是某个字符或不在某个字符里。

例如如果想查找一个单词出现了字母q而后面跟的不是u。可能会写\bq[^u]\w*\b。但对于这样的表达式,当q出现在单词结尾时就会出现错误,因为[^u]会将单词的间隔符匹配掉,这样会进而匹配下一个单词,它会匹配到Iraq fighting这样的字符串。

为了解决反义的占用问题,我们可以使用负向零宽断言,因为它只匹配一个位置,不会消耗掉任何字符。上面表达式的可以写为\bq(?!u)\w*\b。

同理,我们用(?

一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)

  看到前面的(?<=)和后面的(?=),则知道前后都为零宽断言,而<(\w+)>则代表html标记,如果前面的为,则后面零宽断言的意思是(使用了转义和后向引用)。所以这个正则表达式是为了匹配html标记之间的部分。

12.注释

通过语法(?#comment)来包含注释,例如2[0-4]\d(?#200-249)。

13.贪婪与懒惰

  在处理字符串匹配问题时,通常的行为是匹配尽可能多的字符。以表达式a.*b和字符串aabab为例,会匹配aabab,而不是匹配ab,这样的匹配规则称为贪婪匹配。

    而有时,我们需要匹配尽可能少字符的懒惰匹配,这时,需要在上面所说的限定符后面加上?,如a.*?b就将贪婪匹配转化为懒惰匹配,此时会匹配到aab(1-3的字符)和ab(4-5的字符)(具体原因涉及到正则表达式的匹配规则)。

14.处理选项

    类似于js里面的flag,有不区别大小写、多行模式、全局模式等。

15.平衡组/递归匹配

    这部分为了处理匹配问题,例如想匹配数学表达式中(5*3)))中的(5*3),不能简单的写为\(.*\),这样会匹配到整个表达式。那么应当采取的匹配策略类似于学到过的括号匹配问题,用栈来解决,遇到(压栈,遇到)弹栈,如果最后栈为空,这说明表达式里面的括号完全匹配,如果不为空,正则表达式引擎会回溯来使得括号匹配。

相关推荐:

JS的正则表达式如何使用


以上是学习正则表达式基础的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何用php正则替换以什么开头的字符串 如何用php正则替换以什么开头的字符串 Mar 24, 2023 pm 02:57 PM

PHP正则表达式是一种针对文本处理和转换的有力工具。它可以通过解析文本内容,并按照特定的模式进行替换或截取,达到有效管理文本信息的目的。其中,正则表达式的一个常见应用是替换以特定字符开头的字符串,对此,我们进行如下的讲解

如何用 Golang 正则匹配多个单词或字符串? 如何用 Golang 正则匹配多个单词或字符串? May 31, 2024 am 10:32 AM

Golang正则表达式使用管道符|来匹配多个单词或字符串,将各个选项作为逻辑OR表达式分隔开来。例如:匹配"fox"或"dog":fox|dog匹配"quick"、"brown"或"lazy":(quick|brown|lazy)匹配"Go"、"Python"或"Java":Go|Python|Java匹配单词或4位邮政编码:([a-zA

PHP基础教程:从入门到精通 PHP基础教程:从入门到精通 Jun 18, 2023 am 09:43 AM

PHP是一种广泛使用的开源服务器端脚本语言,它可以处理Web开发中所有的任务。PHP在网页开发中的应用广泛,尤其是在动态数据处理上表现优异,因此被众多开发者喜爱和使用。在本篇文章中,我们将一步步地讲解PHP基础知识,帮助初学者从入门到精通。一、基本语法PHP是一种解释性语言,其代码类似于HTML、CSS和JavaScript。每个PHP语句都以分号;结束,注

php 如何用正则去除中文 php 如何用正则去除中文 Mar 03, 2023 am 10:12 AM

php用正则去除中文的方法:1、创建一个php示例文件;2、定义一个含有中文和英文的字符串;3、通过“preg_replace('/([\x80-\xff]*)/i','',$a);”正则方法去除查询结果中的中文字符即可。

php怎么利用正则匹配去掉html标签 php怎么利用正则匹配去掉html标签 Mar 21, 2023 pm 05:17 PM

在本文中,我们将学习如何使用PHP正则表达式删除HTML标签,并从HTML字符串中提取纯文本内容。 为了演示如何去掉HTML标记,让我们首先定义一个包含HTML标签的字符串。

如何使用PHP正则表达式验证URL是否为HTTPS协议 如何使用PHP正则表达式验证URL是否为HTTPS协议 Jun 24, 2023 am 08:16 AM

网站安全性越来越受到关注,使用HTTPS协议保证数据传输的安全性已成为当前网站开发的一个重要内容。在PHP开发中,如何使用正则表达式验证URL是否为HTTPS协议呢?下面我们就来了解一下。正则表达式正则表达式是一种用来描述规律的表达式,是处理文本的强大工具,被广泛应用于文本匹配、搜索和替换等方面。在PHP开发中,我们可以通过正则表达式来匹配URL中的http

使用PHP正则实现中文替换功能的技巧分享 使用PHP正则实现中文替换功能的技巧分享 Mar 24, 2024 pm 05:57 PM

使用PHP正则实现中文替换功能的技巧分享在web开发中,经常会遇到需要对中文内容进行替换的情况。PHP作为一种流行的服务器端脚本语言,提供了强大的正则表达式功能,可以很方便地实现中文替换。本文将分享一些在PHP中使用正则实现中文替换的技巧,同时提供具体的代码示例。1.使用preg_replace函数实现中文替换PHP中的preg_replace函数可以用来

PHP正则替换实例:快速掌握替换技巧 PHP正则替换实例:快速掌握替换技巧 Feb 29, 2024 pm 06:33 PM

PHP正则替换实例:快速掌握替换技巧随着互联网的发展,网站开发变得越来越常见。在网站开发中,经常需要对字符串进行替换操作,而正则表达式是一种非常强大的工具,能够在字符串中快速进行搜索和替换操作。本文将介绍如何利用PHP语言中的正则表达式进行替换操作,并提供具体的代码示例,帮助读者快速掌握替换技巧。1.preg_replace函数在PHP中,可以使用preg

See all articles