细说正则表达式

本文详细介绍了正则表达式中的关键概念,如元字符的作用、字符集的定义、限定符的使用、运算符的优先级以及八进制和Unicode转义。通过实例展示了如何构建和理解复杂的正则表达式模式。
摘要由CSDN通过智能技术生成

目录

概念

基础语法

字符集

否定字符集

简写字符集

重复次数

*

+

?

量词

特征标群

转义特殊字符

边界

^

$

单词边界\b

零宽断言

正先行断言

负先行断言

正后发断言

负后发断言

运算符优先级


概念

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。通俗的讲就是按照某种规则去匹配符合条件的字符串

基础语法

single char(单个字符)quantifiers(数量)position(位置)
\d 匹配数字* 0个或者更多^ 一行的开头
\w 匹配word(数字、字母)+ 1个或更多,至少1个$ 一行的结尾
\W 匹配非word? 0或1个\b 单词边界
\s 匹配white space(空格、tab等){min,max} min到max个
\S 匹配非white space{n} n个
. 匹配任何字符

字符集

字符集也叫字符类,方括号用来指定一个字符集。在方括号中使用连字符来指定字符集的范围。在方括号中的字符集不关心顺序。

[abc] 匹配"你好a"中的a,匹配"adbc"中的a和b和c。

否定字符集

^用在方括号的开头的时候,表示这个字符集是否定的,如:

[^地]学习[^帅]
它学习好 //匹配
地学习不帅
它学习帅吗 

一个特殊的用法:

正则表达式中点(.)是一个特殊字符,代表任意的单个字符,但是有两个例外。一个是四字节的UTF-16字符,这个可以用u修饰符解决;另一个是行终止符。

以下四个为行终止符:

  • U+000A 换行符(\n
  • U+000D 回车符(\r
  • U+2028 行分隔符(line separator)
  • U+2029 段分隔符(paragraph separator)
/foo.bar/.test('foo\nbar') //false

上面代码中因为.不匹配\n,所以返回false,ES2018引入s修饰符,使得.可以匹配任意单个字符。

/foo.bar/s.test('foo\nbar') //true

简写字符集

简写描述
.除换行符外的所有字符
\w匹配所有字母数字,等同于[a-zA-Z0-9_]
\W匹配所有非字母数字
\d匹配所有数字,等同于[0-9]
\D匹配所有非数字
\s匹配所有空格字符,等同于[\t\n\f\r\p]
\S匹配所有非空格字符
\f匹配换页符
\n匹配换行符
\r匹配回车符
\t匹配制表符
\v匹配垂直制表符
\p匹配CR/LF(等同于\r\n),用来匹配DOS行终止符

重复次数

后面跟着元字符 或 的,用来指定匹配子模式的次数。

*

* 号匹配在 之前出现的字符出现0次或多次,例如:

[a-z]*
AAa 匹配
2233AAA 

+

+ 号匹配在 + 之前出现的字符出现至少1次,例如:

\s+你好
 你好    匹配
哦    你好呀    匹配

?

? 表示在 ? 之前出现的字符可选,即出现0或1次。

\s?你好
你好啊 匹配
 你好啊 匹配

量词

 {} 是一个量词,用来限定一个或一组字符可以重复出现的次数。

哈{2,3}
你哈哈 匹配
你哈哈哈 匹配
你哈

省略第二个参数时,表示至少出现n次

哈{2,}
你哈哈    匹配
你哈哈哈    匹配
你哈

省略逗号和第二个参数时,表示出现n次

​哈{2}
你哈哈    匹配
你哈哈哈    
你哈

特征标群

特征标群是一组写在 (...) 中的子模式。 (...) 中包含的内容将被看作一个整体。例如表达式 (ab)* 匹配连续0个或多个ab。(ab){3}匹配连续3个ab。

我们还可以用 |() 中表示或,如 (学习|打工)的汪 匹配"打工的汪"或"学习的汪"

(你好)+啊
嘿你好啊 匹配
嘿啊

转义特殊字符

反斜线 \ 在表达式中用于转码紧跟其后的字符,用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符。如果想要匹配这些特殊字符,要在其前面加上反斜线 \

你好\.
你好. 匹配
你好啊

边界

想要匹配指定开头或结尾的字符串就要使用到边界,^ 指定开头,$ 指定结尾。

^

^ 用来检查匹配的字符串是否在所匹配字符串的开头。

^哈哈
哈哈了 匹配
你哈哈

$

$ 用来检查匹配的字符串是否在所匹配字符串的结尾。
 

哈哈$
你哈哈 匹配
哈哈了

单词边界\b

单词边界是指 [a-zA-Z0-9] 之外的字符

\bis\b
a is b    匹配
a@is@b    匹配
你is猪    匹配
ais b
aisb

非单词边界 \B \b 相反

零宽断言

先行断言和后发断言都属于非捕获簇。先行断言用于所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定的格式。

例如(?<=\$)[0-9]*,匹配$开头,后面包含0到多个数字。

零宽断言如下:

符号描述
?=正先行断言-存在
?!负先行断言-排除
?<=正后发断言-存在
?<!负后发断言-排除

正先行断言

?=...  正先行断言,表示第一部分表达式之后必须跟着 ?=... 定义的表达式。

返回结果只包含满足匹配条件的第一部分表达式(即不会包含先行断言匹配部分的内容)。定义一个先行断言要使用 () ,在括号内部加一个 ?= ,先行断言的内容写在后面。例如, 学习的汪(?=\shong)  首先匹配"学习的汪",然后在括号中我们又定义了正先行断言 (?=\shong),表示"学习的汪"后面紧跟着"(空格)hong"。

学习的汪(?=\shong)
学习的汪 hong 匹配到"学习的汪"
学习的汪 hon 不匹配

负先行断言

负先行断言?!用于筛选所有匹配结果,筛选条件为其后不跟随着断言中定义的格式。表达式 学习的汪(?!\shong) 首先匹配到"学习的汪",然后在括号中我们又定义了负先行断言 (?!\shong),即"学习的汪"后面不跟着"(空格)hong"。

学习的汪(?!\shong)
学习的汪 hong
学习的汪    匹配
学习的汪hong    匹配

正后发断言

正后发断言,记作 (?<=...) 用于筛选所有匹配结果,筛选条件为其前跟随者着断言中定义的格式。例如,表达式 (?<=[学习|打工])的汪 ,匹配"的汪",前面跟随"学习"或"打工"。

(?<=[学习|打工])的汪
学习的汪 匹配
打工的汪 匹配
打的的汪

负后发断言

负后发断言,记作 (?<!...) 用于筛选所有匹配结果,筛选条件为其前不跟随着断言中定义的格式。例如,表达式 (?<![学习|打工])的汪 ,匹配"的汪",前面不能跟随"学习"或"打工"。

(?<![学习|打工])的汪
学习的汪
打工的汪
打的的汪 匹配

运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术运算符非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符  描述
\转义符
(),(?:),(?=),[]圆括号和方括号
*,+,?,{n},{n,},{n,m}限定符
^,$,\任何元字符、任何字符定位点和序列(即:位置和顺序)
|

替换,"或"操作

字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用(m|f)ood

  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值