前言:
正则表达式用来匹配字符,它并不依附于某种特殊的语言而存在,它是一个独立的东西。
但是正因为非常有用,许多语言都提供了对它的支持,包括javascript。
官方的定义是:
在常见的字符串检索或替换中,我们需要提供一种模式来表示检索或替换的规则。正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串。
在javascript中使用正则
正则表达式对象的创建
🌰:
1 | /\d\d\d/.test("123"); // true |
像两个斜杠中间直接写的,这是正则表达式的字面量,这是比较简单的一种创建方式。
当然我们还可以显式使用构造函数来创建,它和字面量是等价的~~
正则表达式基础
正则表达式的匹配规则,其实网上还是有蛮多专门讲这个的文章的,这里我们用一张图来覆盖一下比较基本的知识点:
表示字符匹配的符号:
表示范围的符号:
正则表达式分组匹配:
通过分组,我们可以把每一组单独记录起来,然后可以针对这个分组进行操作~~
反斜杠后面跟的数字是这个分组对应的组序号^_^,这种写法是对已经匹配过的分组的一个引用。
正则表达式中的重复
贪婪算法就是匹配尽可能多的,非贪婪算法就是匹配尽可能少的~~~
正则表达式特殊字符的转义
看这样一个🌰:
1 | /\^abc/.test("^abc"); //true |
从test中参数,很明显我们可以看出目的在于匹配一个以^开头的字符串。但是我们刚刚才看到^本身是正则表达式的一个特殊字符,它用来表示行首。为了让它变成一般字符,就是可以匹配它自己的一般字符,我们需要给它加上反斜杠转义~~~
正则中的三个flag
正则中的三个标志位即:
- g:global (匹配所有的情况 默认匹配一个就结束)
- i:ignoreCase (不区分大小写 默认区分大小写)
- m:multiline (在有换行的时候自动换行检索)
🌰:
1 | /abc/gim.test("ABC"); //true |
写成构造函数形式就是:
1 | new RegExp("abc","mgi"); |
注意顺序是无所谓的~~~
RegExp对象属性
常见的几个属性是:
1 | /abc/g.global; //true |
输出是否全局
1 | /abc/g.ignoreCase; //false |
输出是否忽略大小写
1 | /abc/g.multiline; //fa;se |
输出是否换行
1 | /abc/g.source; //"abc" |
输出源字符串
RegExp对象方法
常用的几个方法是:
- compile (改变正则的一些属性 比如改变它的内容)
- exec (返回匹配的结果)
- test (返回匹配没匹配到)
toString (返回整个正则的内容)
🌰:
1
2
3
4
5
6
7/abc/.exec("abcdef"); //"abc"
/abc/.test("abcde"); //true
/abc/.toString(); // "/abc/"
var reg = /abc/;
reg.compile("def");
reg.test("def");//true
String类型与正则相关的方法
在String类型中,是存在一些可以以正则表达式为参数的方法的。
比如:
- String.prototype.search 返回匹配到的第一个索引
- String.prototype.replace 返回替换的结果
- String.prototype.match 返回匹配的结果
- String.prototype.split 返回切割的结果
🌰:
1 | "abcabcdef".search(/(abc)\1/); //0 |
总结
正则表达式博大精深!
正则的复杂的细节情况,一篇博客绝对写不完。
这里推荐《精通正则表达式》这本书^_^
或者查询更多的资料,进行更深入的学习。