网课笔记:正则表达式部分语法,以及在js代码中的应用

网课的部分笔记,没什么技术含量,记录用,方便查阅

正则表达式在线解析网站:https://regexper.com
亲自用过,感觉还行,这个网站是解析正则表达式的(语法层面解析),不是那种在线测字符串是否匹配规则的。

正则表达式概念:

正则表达式:regular expression 使用单个字符串来描述、匹配一系列符合某个语法规则的字符串
按照某种规则匹配符合条件的字符串
正则表达式定义匹配规则。

定义匹配表达式:var regex = /\bis\b/g; 以/开头,/g收尾,g表示global,为全文匹配,否则只匹配第一个。

这个是js的写法。

//\b指单词边界
//将句子里所有的小写is替换成大写的IS
var regex = /\bis\b/g
'He is a boy.She is a girl.This is a dog'.replace(regex, "IS")

"He IS a boy.She IS a girl.This IS a dog"
还可以使用构造函数定义匹配表达式:
//'g'表示global
var regex = new RegExp('\\bis\\b', 'g')  
'He is a boy.She is a girl.This is a dog'.replace(regex, "IS")

"He IS a boy.She IS a girl.This IS a dog"
修饰符:

g:global,全文搜索
i:忽略大小写,默认为大小写敏感
m:多行搜索
多个修饰符一起用,直接连着写即可:/gi,即表示全文匹配并忽略大小写

元字符:在正则表达式中有特殊含义的字符

在这里插入图片描述

元字符[]:构建一个简单的字符类(符合某些特征的字符类集合)
字符类取反:使用元字符^创建反向类/负向类
eg:[abc]表示a或b或c,[^abc]表示除了abc之外的字符
范围类:[a-z]匹配从a到z的任意字符,闭区间,包含a与z
在[]中组成的类是可以连写的。eg:[a-zA-Z]匹配大小写a到z的所有字符
正则表达式预定义类:用来匹配一系列字符串

在这里插入图片描述

一般来讲,小写和大写之间表达的意思相反:比如\d和\D,一个表示数字字符,一个表示非数字字符。
正则表达式边界匹配字符:

在这里插入图片描述
^和$这俩相对常用,\b和\B我个人用的不多。。。

//边界匹配字符示例,注意区别
//匹配所有的is
'this is a boy'.replace(/is/g, '0')
"th0 0 a boy"

//只匹配字符串开头为i结尾为s的is,这里的is都不是字符串的开头或结尾,所以没有匹配
'this is a boy'.replace(/^is$/g, '0')
"this is a boy"

//匹配单词边界为i和s的is,这里就有一个可以被匹配到了
'this is a boy'.replace(/\bis\b/g, '0')
"this 0 a boy"

//匹配单词边界为s,但是i不为单词边界的is,这里匹配的就是this里面的is了
'this is a boy'.replace(/\Bis\b/g, '0')
"th0 is a boy"
/m修饰符用法:多行匹配:
str='@abc\n@def\n@ghi'
"@abc
@def
@ghi"

//替换以@开头,后面接任意一个字符的字符串,因为没有加修饰符/m,所以只匹配第一行
str.replace(/^@./g, 'X')
"Xbc
@def
@ghi"

//同样的替换规则,加了修饰符/m,就可以多行匹配,这样三行都被替换了
str.replace(/^@./gm, 'X')
"Xbc
Xef
Xhi"
量词:匹配的字符串数量

在这里插入图片描述

\d{3}  //匹配3次数字
\d{3,}  //匹配数字出现3次以上
\d{3,10}  //匹配数字出现3到10次
贪婪模式,非贪婪模式

非贪婪模式:让正则表达式尽可能少地匹配,即一旦匹配成功就不再搜寻。
方法:在量词后加?

//贪婪模式,正则表达式会匹配最多的6位数字
'12345678'.replace(/\d{3,6}/g,'X')
"X78"
//非贪婪模式,正则表达式只匹配到3位数字后就开始进行下一次匹配,所以会匹配到123和456两个结果
'12345678'.replace(/\d{3,6}?/g,'X')
"XX78"
'12345678'.match(/\d{3,6}?/g)
["123", "456"]
分组
使用()达到分组的功能,使量词作用于分组

zqc{3}与(zqc){3}的区别:前者匹配的是zqccc,后者匹配的是zqczqczqc,使用括号分组从而达到不同的匹配效果

或:|
//zqc|jll
//z(qc|jl)l
//匹配zqc或jll
'zqcjll'.replace(/zqc|jll/g,'X')
"XX"
//匹配zqcl或zjll,注意加了分组之后匹配的不同
'zqclzjll'.replace(/z(qc|jl)l/g,'X')
"XX"
反向引用:捕获分组内容
//使用正则表达式完成日期格式转换
//用$1,$2,$3表示第几个分组
//这里两个写法是同样的效果,第一次想用转义字符\,后来发现用不用都行
'2019-08-02'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$2\/$1\/$3')
"08/2019/02"
'2019-08-02'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$2/$3/$1')
"08/02/2019"
忽略分组:不想捕获某个分组,在分组内加上?:
//这里不捕获第二个分组,那么第三个分组就是第二个分组了,此时写$3是没用的
'2019-08-02'.replace(/(\d{4})-(?:\d{2})-(\d{2})/g, '$2/$1')
"02/2019"
'2019-08-02'.replace(/(\d{4})-(?:\d{2})-(\d{2})/g, '$3/$1')
"$3/2019"
前瞻/后顾:正则表达式匹配到的时候,向前/向后检查是否符合断言。
js不支持后顾

这块儿概念比较抽象
在这里插入图片描述

//替换下一位为数字的单词字符
'a2*3'.replace(/\w(?=\d)/g,'X')
"X2*3"
'a2*34v8'.replace(/\w(?=\d)/g,'X')
"X2*X4X8"
//替换下一位不为数字的单词字符,最后一位8,下一位为空,所以也满足匹配条件,也被替换了
'a2*34v8'.replace(/\w(?!\d)/g,'X')
"aX*3XvX"

相当于另外一个匹配条件,但是替换时不替换前瞻/后顾部分

js正则表达式方法:(只记了概念)

test方法:测试正则表达式是否有匹配结果,返回true/false
exec方法:使用正则表达式进行匹配,返回匹配结果并更新正则表达式属性(lastIndex)。没有匹配结果时返回null,有匹配结果返回匹配数组

js字符串方法:(只记了概念)

search方法:搜索与正则表达式匹配的子字符串,返回第一个匹配结果的index,没有匹配返回-1,不执行全局匹配
match方法检索字符串,找到一个或多个与正则表达式匹配的文本,返回数组(非全局调用下返回和exec方法一样,全局调用下返回所有匹配结果,没有其他index,lastIndex等属性)
split方法:可以按正则表达式切割 split(/\d/)按数字切割
replace方法:可以按正则表达式替换,替换内容可以是函数

常用方法只记了概念,将来用的时候再去进行查找吧
其实我写java多一点,应该查查正则表达式在java中的使用,然后写点什么,这门课还是针对js来讲的,不过正则表达式这东西语法都一样,会了语法也行。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值