由一道题目引发的对于正则表达式的深入学习 ?
【js】去除字符串中最后一个指定的字符
function delLast(str, target) {
let reg = new RegExp(`${target}(?=([^${target}*])$)`)
console.log(str.replace(reg, '')) // number1s
}
delLast("number1ers", "er")
`` 反引号
- 可以用来在字符串中嵌入变量
- 定义普通字符串或多行字符串
正则表达式
中括号表达式
若要创建匹配字符组的一个列表,请在方括号[]
内放置一个或更多单个字符。
/Chapter [12345]/ // 匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5
/Chapter [1-5]/ // - 表示范围,匹配同上
/Chapter [^12345]/ // 匹配1、2、3、4 或 5 之外的任何数字和字符
/[A-Za-z0-9]/ // 指定任何大写或小写字母或任何数字的匹配
基本模式匹配
-
^
表示只匹配那些以…开头的字符串。 -
$
匹配以…结尾的字符串。 -
字符
^
和$
同时使用时,表示精确匹配(字符串与模式一样)。^bucket$
只匹配字符串"bucket"。
-
如果一个模式不包括
^
和$
,那么它与任何包含该模式的字符串匹配。
字符簇
当在一组方括号里使用 ^
时,它表示"非"
或"排除"
的意思,常常用来剔除某个字符。
^[^0-9][0-9]$
要求第一个字符不能是数字。这个模式与"&5"、“g7"及”-2"是匹配的,但与"12"、"66"是不匹配的。
替换和分组
-
替换使用
|
字符来允许在两个或多个替换选项之间进行选择。 -
若要防止匹配被保存以备将来使用,在括号内正则表达式模式之前放置
?:
。/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
要么匹配行首的单词 Chapter,要么匹配行尾的单词 Section 及跟在其后的任何数字;不保存子匹配项。
-
正向预测先行使用
?=
指定,匹配处于括号中匹配正则表达式模式的起始点的搜索字符串。/Windows(?=95 |98 |NT )/
匹配 Windows 95、Windows 98 和 Windows NT。
找到一处匹配后,紧接着就在匹配的文本(不包括预测先行中的字符)之后搜索下一处匹配。例如,如果上面的表达式匹配 Windows 98,将在 Windows 之后而不是在 98 之后继续搜索。 -
反向预测先行使用
?!
指定,匹配处于与正则表达式模式不匹配的字符串的起始点的搜索字符串。
先行断言 和 后行断言
-
先行断言 指的是,x 只有在 y 前面才匹配,必须写成
/x(?=y)/
。 -
先行否定断言 指的是,x 只有不在 y 前面才匹配,必须写成
/x(?!y)/
。 -
后行断言 指的是,x 只有在 y 后面才匹配,必须写成
/(?<=y)x/
。 -
后行否定断言 指的是,x 只有 不在 y 后面才匹配,必须写成
/(?<!y)x/
。
“后行断言” 的实现:需要先匹配 /(?<=y)x/ 的 x,然后再回到左边,匹配 y 的部分。这种 “先右后左” 的执行顺序,与所有其他正则操作相反,导致了一些不符合预期的行为。
🔗 推荐链接: