正则表达式 详解

1.作用:搜索和替换——正则表达式的作用



2.匹配单个字符:

正则表达式可以包含纯文本当然,这样用正则表达式也是一种浪费
正则表达式字母大小写敏感

匹配任意字符:
.元字符可以匹配任意的 一个 字符
我们有时候在文本中还需要去匹配字符.这时候我们的正则表达式中的元字符.已经有了实际的含义,我们就必须对模式中的.进行转义
这时候我们利用元字符\堆元字符.进行转义,这时候的正则表达式中.代表的就不是元字符的含义了,我们这时候代表的是.这个这个字符本身
换句话来说,正则表达式更像是一个模式,我们通过指定的模式去在源字符串中匹配相应的子串
但是并不是说正则表达式处理出来的说就是我们需要的而结果,我们还需要对正则表达式处理之后的数据结果再度利用


3.匹配一组字符

元字符[],代表定义一个字符的范围,我们在该位置要待查的单个字符必须在这个元字符所框定的区间范围内,注意我们这里[]待查的是一个单个字符,只不过我们确定了一个范围的模式
优化,在正则表达式中,我么还要定义一种区间,在这个区间范围内的字符全部都满足我们正则表达式的要求
定义元字符-,在[]元字符之间,我们通过这种方式我们来表示一段字符区间,减少了我们枚举大量的字符的工作量
合法的字符区间:
A-Z
a-z
A-F
A-z  这里用的是ASCII的定义,我们的-连字符表示的是在ASCII范围内的字符连续区间,但常用的区间还是数字和字符区间
注意:我们定义区间的时候首位置必须要低于尾位置,否则会使得模式匹配失败
-元字符之后在[]之间才有司机的含义,在[]之外只是一个简单的纯文本匹配
^元字符表示我们取非,这个范围外的所有的字符都是符合匹配的,^效果是[]全局性的·


4.转义:

我们都只到正则表达式存在很多的元字符,但是我们需要对元字符本身进行匹配的话的时候,我们就需要用到转义字符
配对的[]不用做元字符的功用的时候我们必须要将其转移掉,否则正咋表达是会返回一个错误


5.匹配空白元字符:
在正则表达式中,我们的元字符的对象基本可以分为两种,一种是纯文本,另一种比较特殊的就是我们匹配空白字符
\n
\r
\f换页
\t
\v
\r\n文本行的结束标记


6.匹配特定的字符序列:
字符类,我们称之为字符类
匹配数字(非数字):[0-9]~[0123456789]~[^0123456789]~[^0-9]
但是我们的正则表达式支持我们的\d(任何一个数字),\D(任何一个非数字)
匹配数字和字母:
\w任何一个数字字母下划线,相当于[a-zA-Z0-9_]
\W[^a-zA-Z0-9_]
匹配空白字符:
\s任何一个空白字符[\f\n\r\t\v]
\S相反[^\f\n\r\t\v]
匹配十六进制或者匹配八进制





第五章: 重复匹配

以上的内容我们讲解了如何匹配单个字符,现在下面的额内容我们来讲解一下如何同一时间匹配大量的多个字符(重复出现的字符或字符集合)


1.+

想要多次的匹配一个字符我们就只需要在要重复的字符后面加上+,表示重复就可以了
这里注意+至少匹配一个,不匹配0个字符
给字符集合加上+的时候,我们的+必须放置在元字符[]的外面
在这里,+也是一个元字符,我们想要匹配+就必须要对+进行转义
其实在字符集合元字符[]中,我们的其他的元字符都不用手动转移,我们的编辑器自动会将我们的[]元字符内的元字符转义


2.*

但是有的时候,我们对摸个字符的需要又是,我们有时候还需要匹配到没有该字符的情况,也就是该字符我们可以匹配0到任意多次
这是后我们的+元字符就没有用处了,我们这时候需要用到*元字符来实现这个功能


3.?

有时候,我们有需要匹配0个或者1个字符,这时候我们就需要用到?元字符,该元字符的意义就是,前面被限定的字符或者字符集合只能被匹配0,或者1次


4.重复次数{}

在这里,我们会发现+,*,?匹配的次数下线是0,或者1,上限没有确定,但是一旦我们需要确定一个重复的范围,我们就没有办法只通过这三种元字符来实现精确的控制了
这时候,我们引入{}元字符
首先{}本身也是两个元字符,如果我么想要对他们本身做模式匹配我们就需要使用转移符号\
就用#336633这种颜色的RGB值来看,我们会发现我们如果想用+*?来精确匹配是必须要连着写六次的,但是我们完全可以用{6}来表示这个意思,只有精确的匹配了六次我们才算是一个成功的匹配,否则我们都认为匹配失败


5.{}设定重复的范围区间

{}语法还支持我们为串设定一个匹配的次数的区间,也就是说,我们可以为重复的匹配次数设定一个最小值和最大值,语法类似于{2,4}意思就是最少重复2次,最大重复4次
重复的次数设定成0次
{3,}表示只设定了最小下界,上界没有限制


6.过度匹配

除了{},?这种确定性的匹配元字符
我们定义的+*都是不确定长度的元字符,这两种元字符我们在进行处理的时候实际上都是采用贪婪的准则,尽可能在允许的范围内匹配尽可能多匹配串
但是我们有时候与不想一次性匹配那么多的元字符,这时候我们就需要懒惰版本的+*元字符,实际上就是在
1.*?
2.+?
3.{n,}?
就有这三种懒惰的元字符匹配版本




第六章:位置匹配

注意这里的^,$代表的是要匹配的字符串的开头和结尾的性质,如果开头有则满足这个性质开始匹配,开头没有这个性质我们则认为没有找到任何匹配,^$之后和之前的紧邻的一个字符就是我们要找的字符串的开头或者结尾的属性
1.
首先我们需要了解位置匹配符匹配的不是一个字符,他只是匹配一个位置
有时候我们不只是要对所有的文章进行匹配,我们需要对一段文章的某一段的位置的文本进行匹配,这时候我们就引入了位置匹配的概念
在正则表达式中我么使用位置界定元字符来界定我们的匹配的位置
\b只匹配一个位置,不匹配任何的字符
\b匹配的位置的描述是匹配一个\w和\W之间的一个位置,也就是它用来分割一个单词
相反,\B匹配的是一个不是单词边界的一个字符位置(可能的情况是:非单词+非单词,这里的+代表的是连接)


2.字符串边界
定义字符串边界的元字符有两个
定义字符串开头^(这里的^元字符实际上是一种多用途元字符)——只有在^紧跟在[之后的时候才会发挥求非操作,如果放在[]的外面并且位于模式串的开头我们知识后定义为字符串位置元字符开头,其余的时候都只是简单地模式匹配
定义字符串结尾$


3.分行匹配模式
有的语言的正则表达式引擎支持分行字符串分割标志
有时候我们要将一整段文本匹配出来,我们这时候就需要用(?m)分行字符串匹配元字符,这个元字符的意思是,我们定义分行符是做字符串模式匹配的结尾,这样就会避免贪婪字符的任意匹配从而实现将一行的元素都匹配出来




第七章: 子表达式

1.什么是子表达式:
我们都知道,大多数的元字符都只是支持对我们的元字符的前一个或者后一个字符进行修饰
eg:
;{2,}
但是我们有时候想让{2,}对一个表达式进行修饰,而不仅仅是{}之前的一个字符,这个时候我们就需要用的打字表达式


2.定义:
子表达式是更大的表达式的一部分,我们将一个大的表达式进行分解,分解成相应的几个小的表达式,我们的目的是将这些表达式当成一个独立的元素来使用,子表达式我们用()阔起来
注意()也是一种元字符,一旦我们需要在文本中对()进行匹配的话,我们就需要用转义符号\(或者\)
这时候我们的一个子表达式中的所有的元素就会单独作为一种元素被整体的修饰
这里我们再引入一个|元字符,该元字符的作用是或匹配,我们每次都匹配|前或者后面的文本,但是这里就会要注意到和()的联合使用,因为|识别的时候我们的|有可能将后面的整个文本都当成是一个元素,这时我们就需要()
(|)就可以很好的解决这个问题


3.子表达式的嵌套
理论上子表达式的嵌套没有限制层数,但是在实际中我们要适可而止,我们通常将()和|紧密结合,可以写出
功能强大的枚举出所有的可行解的情况的正则表达式
其实我们还可以说,()是对|做出了精确地定义        其实()子表达式优点相当于是我们的高级程序设计语言中的逻辑判断的结合



第八章: 回溯引用,前后一致匹配

这一张我们来讲解子表达式的另一个用处,就是定义定义回溯引用
1.回溯引用有什么用处:
加入我们需要匹配HTML文档中的标签,我们就需要利用<[Hh][1-6]>.*?</[hH][1-6]>这样的文档标签,但是我们这里需要注意到,如果出现了
<h2>....</h3>的情况,我们的正则表达式是检查不出错误的,这时候我们就需要利用子表达是的另一个应用,也就是我们所谓的回溯引用


2.定义回溯引用,回溯引用值得是模式的后半部分 引用在前半部分中定义的子表达式,说实在的回溯引用有点相当于是一个变量
我们这里的回溯引用\1,\2,\3...\n的意思就是我们那回溯引用之前定义的第n个子表达式


3.注意:
回溯引用只能引用模式里的子表达式
回溯引用通常从1开始计数,但是有时候\0也是合法的
这里的第几个子表达式的定义我们是根据相对位置来判断的


4.这里的回溯引用在文本的替换操作的时候,用的将会非常的频繁,但是我们的替换操作需要两个正则表达式,一个用来个给出搜索模式,另一个我们用来寻求文本的替换模式,回溯引用可以跨模式使用
在第一个搜索的正则表达式中的文本我们可以在替换的正则表达式中进行回溯引用


第九章:前后查找

前言,有时候,我们需要对文本的莫一部分特定的查找内容,但是我们又不想将文本的特定的表示符抽取出来,我们只想要文本的内容,这时候后我们
为了防止文本的多余查找,引入了前后查找的概念


1.向前查找:
向前查找制定了一个我们必须要匹配的但是不在结果中返回的模式,向前查找实际上也就是一个子表达式
eg:
我们想要将URL的协议名称提取出来,但是我们只要协议的名称,这时候,我们这么来用向前查找的子表达式
.+(?=:)这里我们的.+的意思就是提取协议的名称,比如http,https,ftp等等
之后的(?=:)子表达式的意思就是,我们定义一个子表达式(向前查找)制定的内容是:也就是说,我们将:之前的所有的文本都匹配出来,但是我们又不要:这个符号作为我们的匹配的返回的结果


2.根据我们的额描述,其实任意一个子表达式都可以转化成对应的一个向前查找的模式匹配的子串,我们需要做的额就是只是给子表达式加上一个?=的子串罢了


3.?=我们称之为是向前查找操作符,除了向前查找之外,很多的正则表达式还支持向后查找?<=


4.向前查找的模式的长度是随意的,是可变的,我们支持在子表达式中使用.*/.+之类的元字符,但是向后查找我们限定了固定的长度,这是所有的正则表达式都遵守的规则


5.我们那还可以将向前查找和向后查找结合起来就可以实现对我们上述提到的HTML 文本的标题内容提取的作用了


6.总计一下,我们的前后查找额实际上的作用是帮我们确定一个我们想要确定的模式的一个具体位置,这里我们引入一条书与,在之前的我们利用前后查找的思路实际上都可以称作是正向前或者
正向后查找,整的意思是寻找匹配
还有一种匹配的模式叫做负向前和负向后查找文本,即我们向前或者向后擦好渣和莫表的文本不匹配的文本,我们的这种的表示符也很简单
(?=) -> (?!)
(?<=) -> (?<!)


第十章:  嵌入条件

1.正则表达式支持在表达式的内部嵌入条件处理的功能
2.正则表达式中的条件我们必须要用?去处理和定义


3.回溯引用条件:
回溯引用条件只在我们的前一个表达式搜索成功的时候我们才允许使用一个表达式


4.定义语法:
(?(一个回溯引用代表条件,这里的天上的是前面的子表达式的下跪的为止,一般都是从1开始,并且里面的数字不能用之前我么扽回溯引用的\转义,这是个特殊的语法格式,记住就好)(........这是一个只有在前面的回溯引用执行成功的时候才会执行的子表达式))
上面的条件判断式是没有else语句的,要加上否则判断的话,我们需要另外一个语法格式
(?(回溯引用的标号)(yes时执行的子表达式)|(false执行的子表达式))


5.前后查找条件
上面我们讲述了回溯引用的查找条件,现在我们来讲解另一个查找条件,家偶偶前后查找条件
前后查找条件,我们只在一个向前查找或者向后查找成功的时候我们才调用
我们的语法的格式是
(?(?=)(操作成功之后要执行匹配的子表达式))
但是实际上,我们的工作中很少会用到嵌入了前后查找的子表达式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值