【前端】正则表达式的简单使用
正则表达式
- 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。
- 在 JavaScript中,正则表达式也是对象 。
- 通常用来查找、替换那些符合正则表达式的文本,许多语言都支持正则表达式。
语法
定义正则表达式语法
-
字面量形式
1
let 变量名 = /表达式/
- 其中,
/ /
是正则表达式字面量 - 是
object
(复杂数据类型)
- 其中,
-
内置构造函数创建
1
2var res=new RegExp(‘abcd’)
console.log(res) // /abcd/
判断是否有符合规则的字符串
test()
方法:用来查看正则表达式与指定的字符串是否匹配。
例如:
检查(查找)符合规则的字符串
exec()
方法:在一个指定字符串中执行一个搜索匹配。
例如:
元字符
-
普通字符
大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。 也就是说普通字符只能够匹配字符串中与它们相同的字符。
-
元字符(特殊字符)
是一些具有特殊含义的字符,可以极大提高了灵活性和强大的匹配功能。
- 比如,规定用户只能输入英文26个英文字母,普通字符的话 abcdefghijklm……
- 但是换成元字符写法: [a-z]
边界符
正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符:
边界符 | 说明 |
---|---|
^ | 表示匹配行首的文本(以谁开始) |
$ | 表示匹配行尾的文本(以谁结束) |
如果^
和$
在一起,表示必须是精确匹配。
例如:
量词
量词用来 设定某个模式出现的次数
量词 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
注意:逗号左右量词千万不要出现空格
例如:
字符类
[ ]
匹配字符集合
后面的字符串只要包含 abc 中任意一个字符,都返回 true 。
例如:
[ ]
里面加上 -
连字符
表示一个范围,比如:
-
[a-z]
表示a
到z
26
个英文字母都可以 -
[a-zA-Z]
表示大小写都可以 -
[0-9]
表示0~9
的数字都可以
[ ]
里面加上 ^
取反符号
比如:
-
[^a-z]
匹配除了小写字母以外的字符 -
注意要写到中括号里面
.
匹配除换行符之外的任何单个字符
预定义字符
指的是某些常见模式的简写方式
预定类 | 说明 |
---|---|
\d | 匹配0-9之间的任一数字,相当于**[0-9]** |
\D | 匹配所有0-9以外的字符,相当于**[^0-9]** |
\w | 匹配任意的字母、数字和下划线,相当于**[A-Za-z0-9]** |
\W | 除所有字母、数字和下划线以外的字符,相当于**[^A-Za-z0-9_]** |
\s | 匹配空格(包括换行符、制表符、空格符等),相当于**[\t\r\n\v\f]** |
\S | 匹配非空格的字符,相当于**[^\t\r\n\v\f]** |
比如:
修饰符
修饰符约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等。
简单修饰符
语法:/表达式/修饰符
-
i
是单词ignore
的缩写,正则匹配时字母不区分大小写 -
g
是单词global
的缩写,匹配所有满足正则表达式的结果
比如:
替换replace
语法:字符串.replace(/正则表达式/,'替换的文本')
正则的贪婪和非贪婪
贪婪(+)
1 | const reg = /\d+/ |
非贪婪(?)
1 | const reg = /\d+?/ |
??
1 | const reg = /\d??/ |
{n,}? 获取 n 个
当 n 为 1 的时候,等价于+
当 n 为 0 的时候,等价于*
例子
-
获取开标签
1
2
3
4const str = '<div>你是什么呀</div>'
//获取开标签
const reg = /<.+?>/
console.log(reg.exec(str)) //div -
匹配的一个字符
1
2
3
4const reg = /abcd{2}/
//是匹配前面一个字符
console.log(reg.test('abcdabcd')) //false
console.log(reg.test('abcdd')) //true
正则特殊字符
()
:一个整体
作用:1. 表示把 abcd 当作一个整体 2. 单独捕获
1 | const reg = /(abcd){2}/ |
单独捕获的场景: 从左括号开始依次捕获,当作整体
1 | const reg = /(\d+(\s+))\d+/ |
不写小括号时
1 | const reg = /\d+\s+\d+/ |
(?:)
:整体捕获
|:占位或.表示左边或者右边都行,大部分时候和小括号连用.分开的是左边右边整个
1 | const reg = /(abc|def)/ |
小练习:如果我们不加小括号。下列正则表示,以 abc 开头,以 def 结尾
1 | const reg = /^abc|def$/ |
[]:表示包含中间的任意一个都行.占一个字符位置
1 | const reg = /[abcd]/ |
[^]:表示包含中间的任意一个都行.占一个字符位置
1 | //表示由一个字符组成,只要不是a.b,c,d中的都可以 |
-:是使用在[]里面的符号,表示从哪一个字符到哪一个字符.,前提是他们的 Ascll 是连着的
1 | //表示由一个字符组成,可以是0-9任意 |
等价组合形式
- [0-9a-zA-Z_]等价于\w
- [^0-9a-za-z_]等价于\W
- [0-9]等价于\d
- [^0-9]等价于\D
- [ ]等价于\s
- [^ ]等价于\S
当我们在**[]里面的时候,点(.)**就表示一个点,不是上文所述的非换行任意字符
小练习
验证一个字符串,只能由字母数据下划线组成,6-12 位,不能以下划线开头
1 | const reg = /^[0-9a-zA-Z]\w{5,11}$/ |
获取 HTML 标签里面的 text
1 | const str = '<div>你是什么呀</div>' |
正则表达式的预查
比如:“ES2015,ES2016,ES2017 都是 JavaScript 的语法标准”,我们想要查到 ES2015,ES2016
正向肯定预查(?=)
1 | const reg = /^ES(?=2015|2016)/ |
正向否定预查(?!)
当我在捕获内容的时候,后面必须跟着不是我所指定的.我要的是 ES,但是后面不能跟 2015 和 2016
1 | const reg = /ES(?!2015|2016)/ |
负向肯定预查(?<=)
后面是 ES,要求前面是 2015 或者 2016
1 | const reg = /(?<=2015|2016)ES/ |
负向否定预查(?<!)
后面是 ES,要求前面不能是 2015 或者 2016
1 | const reg = /(?<!2015|2016)ES/ |
重复出现符号
/num:num 是一个数字,表示正则第 num 个可被捕获的()。
这个可被捕获的小括号位置是什么,出现一份一模一样的内容
1 | const reg = /(abc|def)\d+\1/ |
邮箱匹配
名字:6-8 位,不能以_开头,只能是数字,字母下划线组成
只能是 qq 或者 163 或者 sins 邮箱
1 | const reg = /^[0-9a-zA-Z]\w{5,7}@(qq|163|sina)\.(com|cn)$/ |
手机号
1 | const reg = /^(?:\+86)?((133|158)\d{8})$/ |
正则表达式标识符
标识符:是写在正则表达式外面,用来修饰整个正则表达式的
i:忽略大小写
g:全局
y:粘性全局
语法:/abcc/igy
1 | New RegExp('abcd','igy) |
i,忽略大小写
1 | const arg = /abcd/ |
g,全局匹配
因为我们匹配或者捕获都是只能捕获第一个
1 | const arg = /abc/g //全局 |
y,粘性全局
1 | const arg = /abc/y //全局 |
参考文章:
https://donghuan1224.gitee.io/my-blog/2022/02/10/迷惑点合集/6_正则学习/#toc-heading-28