正则表达式的使用

本文详细介绍了正则表达式的元字符及其用途,包括位置、字符、数量和模式匹配;展示了如何同时使用多个匹配条件、分组、捕获组和反向引用;以及零宽断言、贪婪与懒惰匹配的概念。还涵盖了处理选项和注释的使用。
摘要由CSDN通过智能技术生成

一、元字符

分为4类,匹配字符、匹配位置、匹配数量、匹配模式
(组成正则表达式时,是按照 匹配字符、匹配数量、匹配位置的顺序组合的)

常用代表位置和字符的元字符有

.:代表字符,匹配除换行符以外的所有单个字符
\d:代表字符,匹配单个数字
\w:代表字符,匹配单个字母、数字、下划线或汉字
\s:代表字符,匹配任意单个空白符(例如,空格、制表符Tab、换行符、中文全角空格)
\b:代表位置,匹配单词的开始或结束处
^:代表位置,匹配字符串的开始
$:代表位置,匹配字符串的结束

常用的代表数量匹配其前面内容的元字符有

*:重复任意次
+:重复1次或多次
?:重复0次或1次
{n}:重复n次
{n,}:重复n次或多次
{n,m}:重复n到m次

举例:
we are still studying and so busy
\bs\w*\b:匹配所有以s开头的单词
hello\d+ :匹配hello后有1个或多个数字的字符串
^\d{5,12}$ :匹配以数字开始、以数字结尾,且数字个数为5-12个的字符串
we\d? :匹配we后有0个或1个数字的字符串

字符转义

使用 \ 取消的元字符特殊意义,以便查找元字符本身。

自定义字符集

通过 [] 自定义字符集,里面写上待匹配的字母、数字和标点符号,可以一一列出,也可以通过-来表示范围(例如[0-9]、[a-z])

反义

之前的匹配方式是找到与目标相同的字符串,其实也有反义的用法,即找到除了目标以外的字符串。
对于代表数字、位置的元字符,其反义一般是大写;对于自定义字符集,其反义就是在[]内第一个字符前加上^。例如以下常用反义:
\D :代表字符,匹配除数字以外的单个字符
\W:代表字符,匹配除字母、数字、下划线或汉字以外的单个字符
\S:代表字符,匹配除空白符(例如,空格、制表符Tab、换行符、中文全角空格)以外的任意单个字符
\B :代表位置,匹配除单词的开始或结束处的单个字符

二、同时使用多个匹配条件

来隔开多个正则表达式,匹配条件之间是"或"的逻辑关系,并且从左到右有先后判断顺序

三、分组

使用小括号指定一个表达式,就是对这个表达式分组。分组会被存储到临时缓冲区中,以便后续重新使用。
例如,要匹配ip地址(注意每个分量不应大于255):
((25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d).){3}(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)

(一)、捕获组

1、定义:捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。包括:
(1)(exp):普通捕获组。反向引用,匹配exp,并捕获文本到自动命名的组里
(2)(?exp):命名捕获组。反向引用,匹配exp,并捕获文本到自动命名为name的组里
注意: (?:exp) 非捕获组。单纯用于匹配exp,不捕获匹配的文本,也不给此分组分配组号。使用场景举例:仅使用正则表达式 (?:(name)yes|no) 进行条件判断,而不需要捕获匹配的内容。
2、捕获组的编号规则:
1)只有普通捕获组时。按照’(‘出现的顺序由1开始对捕获组编号。
2)只有命名捕获组时。也是按照’('出现的顺序由1开始对捕获组编号。
3)混合有普通捕获组和命名捕获组时。先忽略命名捕获组,对普通捕获组进行编号,当普通捕获组完成编号后,再对命名捕获组进行编号。

(二)、反向引用

捕获组捕获到的内容,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用。 对前面捕获组捕获的内容进行引用,这种引用方式就是反向引用。
(1)普通捕获组反向引用:\k<number>,通常简写为 \number
如上述ip地址案例,可以改写为:((25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d).){3}\2 ,其中\2指代的就是第2个括号内的分组,即(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)
(2)命名捕获组反向引用:\k<name> 或者 \k’name’
如:(?<Digit>\d+) 或 (?‘Digit’\d+) 定义的是名为Digit的匹配条件为"\d+"的分组,反向引用该分组可以使用\k<Digit>来引用。

四、零宽断言

使用场景:当使用正则表达式搜索内容时,如果需要捕获的内容前(或 后)必须是(或 不能是)某些特定内容,但又不捕获这些特定内容的时候,这个时候就可以使用零宽断言。
这种断言不会匹配任何字符,也不占据字符的宽度,它主要用于指定一个位置(在目标字符的左边或右边),并在这个位置上检查是否满足特定的条件(匹配/不能匹配)。(因此称作"零宽")
零宽断言分为正向/负向(必须/不能匹配exp表达式)、先行/后发(表达式在目标字符的右边/左边):

  • (?=exp) 正向零宽先行断言:目标字符出现位置紧邻的右边必须匹配到这个表达式。
    例如:‘[a-z]{1,}(?=\d+)’ 指的是目标字符按[a-z]{1,}匹配,其紧邻的右边必须要有\d+
  • (?<=exp) 正向零宽后发断言:目标字符出现位置紧邻的左边必须匹配到这个表达式。
    例如:‘(?<=\d{3}).+’ 指的是目标字符按.+ 匹配,其紧邻的左边必须是\d{3}
  • (?!exp) 负向零宽先行断言:目标字符出现位置紧邻的右边不能匹配到这个表达式。
    例如:‘[a-z]{1,}(?!\d+)’ 指的是目标字符按[a-z]{1,}匹配,其紧邻的右边不能有\d+
  • (?<!exp) 负向零宽后发断言:目标字符出现位置紧邻的左边不能匹配到这个表达式。
    例如:‘(?<!\d{3})[a-z]+’ 指的是目标字符按[a-z]+ 匹配,其紧邻的左边不能是\d{3}

注意,在使用后发断言时,自定义的断言必须有固定的宽度,比如’(?<!\d{3})[a-z]+'中的\d{3}。如果将该例中的\d{3}改为\d{2,} 会报如下错误: error: look-behind requires fixed-width pattern

五、匹配模式

贪婪匹配模式

正则表达式默认是贪婪模式,即按照尽可能匹配多的字符去匹配。

懒惰匹配模式

如果要尽可能匹配较少的字符,就要需要用到懒惰模式,用 ‘?’ 来标志启用。
例如:待匹配字符串’a12b1234b’,正则表达式’a\w+b’会按照默认尽可能匹配多的字符的规则匹配到’a12b1234b’,但是正则表达式’a\w+?b’会启用懒惰模式匹配到’a12b’。

五、处理选项

一般正则表达式的实现库都提供了用来改变正则表达式处理选项的方式。例如:忽略大小写、忽略空白等。

六、注释

正则表达式中也可以输入注释,通过语法 (?#comment) 来实现 。
例如:\b\w+(?#字符串)\b
要包含注释的话,最好是启用 “忽略模式里的空白符” 选项,这样在编写表达式时 能任意地添加空格、Tab、换行,而实际使用时这些都将被忽略。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值