正则,功能十分强大,其中参杂着很多规则,看起来很复杂,让人恶心,一直以来,对于正则,项目中也只是简单的使用,一般使用正则表达式工具,直接copy。但是最近在源码学习中,觉得有必要深入梳理一下正则相关的知识,真正的 '勇士',必须要勇于面对,来吧,搞起!!
下面,主要从两个大方面,进行总结
1.是什么
2. 怎么用(相关语法,特性)
一. 正则是什么
正则表达式他的操作对象是字符串。
正则表达式用于字符串查找,只是可以更加高级的查找,查找之后可以按需直接使用或替换等。比如在字符串“abacadabvcababacad”中查找a:
在JavaScript语法中,可以 'abacad'.search('a'); 但是如果查询条件是下面的条件,用普通的查询就不能完成了。
要求查找a,什么样的a呢?后面必须是b的a。这正是正则表达式的用武之地
二. 正则怎么用
关于正则的使用,我准备从以下方面分别总结
- 创建正则表达式
- 正则的基本语法
- 正则的修饰符(标志位)
- 正则语法中的量词
- 正则中涉及的属性和方法
- 正则中的贪婪匹配和惰性匹配
- 正则中的分组和反向引用
- 正向前瞻,反向前瞻
1.创建正则表达式的三种方式
<script>
let str = 'abch abc';
// 第一种方式
let regexp = /h/g; // 直接写通过/ /
// 第二种方式
let regexp = new RegExp(/h/, 'g'); // 第一个参数是表达式,第二个是修饰符
// 第三种方式
let regexp = new RegExp('h', 'g');
</script>
2. 正则表达式中的基本语法
根据以上对应的解释,大家可以在正则表达式工具中,测试一下,推荐一款谷歌插件fehelper,可以在这个插件的正则表达式工具中测试
3.正则表达式中的修饰符
“/正则表达式/修饰符” 或者
“var r = new RegExp(正则表达式, 修饰符);”
并且一次可以使用多个修饰符。
正则中常用的有三种修饰符
1、ignoreCase,简写为 i
正则加上 i,那么就 不区分大小写
2、global,简写为 g
正则加上 g,就会 全局匹配
3、muitiline,简写为 m
正则加上 m,就会多行匹配,而往往多行匹配也要加上 g 才行
那或许你有疑问了,多行匹配我直接g去匹配全局不就完了,干嘛还加上m呢??? 确实这样,
但是,如果你想匹配多行的开头,那么这个m就有用了
4.另外还有,大家可以了解一下
4.正则中的量词
n+ 匹配任何包含至少一个 n 的字符串。匹配一个或多个前导字符(前导字符就是紧挨着+的前一个字符)
n* 匹配任何包含零个或多个 n 的字符串。前导字符有没有都行
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 到 Y 个 n 的序列的字符串,包括X和Y个
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
5.正则的属性和方法
1.关于正则的属性,和上边的修饰符有些关系
- 属性 source
返回正则的字符串形式
- 属性 ignoreCase
返回 当前正则是否设置 忽略大小写
-
属性 multiline
返回 当前正则是否设置 多行匹配
2.正则的方法,如下图
- exec
找出字符串中的 匹配项,返回一个数组,数组 包含 第一个匹配项,index(匹配项在字符串中的位置),input(匹配的字符串)
exec 需要记住两个点
1、常用于正则捕获时, 捕获就是把特定的字符串抓出来,在后面会详细说
2、不管是否设置 全局搜索 g,都只会返回 一个匹配项
1. 没有设置全局匹配g ,不管你调用多少次exec(),返回的始终是匹配到的第一项
2.设置了全局匹配g,那么 exec 会在字符串上 继续 去匹配
- test
验证字符串是否可以匹配正则,返回 布尔值,常用于表单验证
- match
这个方法,返回的东西,跟是否设置全局有关
1.没有设置全局时,返回的和exec的返回一毛一样
2.设置全局后
- search
返回所在的起始位置,如果找不到,返回-1
- replace
正则替换,replace
- split
把不是匹配项的放在一个数组里面
和字符串的split方法一样,但是使用正则可以处理更复杂的情况
当前文章总结了前五条,后边关于正则的贪婪匹配,惰性匹配,分组和反向引用,正向前瞻以及反向前瞻,在下一篇文章👇👇👇