正则表达式的概念
正则表达式(Regular Expression)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一些列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
创建正则表达式
- 构造函数
var reg = new RegExp("hello","g");
- 字面量(常用)
var reg = "/hello/g";
正则表达式中特殊字符
元字符
在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符
()
[]
{}
\
^
$
|
?
*
+
.
字符 | 意义 |
---|---|
\t | 水平制表符 |
\r | 回车符 |
\n | 换行符 |
\f | 换页符 |
\v | 垂直制表符 |
\0 | 空字符 |
在不同的组合中元字符有不同的意义
字符 | 意义 |
---|---|
\t | 水平制表符 |
\r | 回车符 |
\n | 换行符 |
\f | 换页符 |
\v | 垂直制表符 |
\0 | 空字符 |
单个字符
[]
表示单个字符,[abc]
匹配一个字符,这个字符是字符a
,b
,c
中的一个
var str = "a00000";
console.log(str.match(/[abc]/)); //["a"]
元字符[]
与^
组合为取反(非)
[^abc]
表示不是字符a
,b
,c
中的一个
范围类
如果字符匹配的是数字,可以写成下面的形式
var reg = /[0123456789]/;
当然也可以写为
var reg = /[0-9]/;
//匹配a-z中的任意一个
var reg = /[a-z]/;
//匹配大写字母,小写字母,数字
var reg = /[a-zA-Z0-9]/;
预定义类
字符 | 等价于 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车符和换行符之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x08\f\r] | 空白符 |
\S | [^\t\n\x08\f\r] | 非空白符 |
\w | [a-zA-Z0-9_] | 字母(包含大小写),数字,下划线 |
\W | [^a-zA-Z0-9_] | 非字母(包含大小写),数字,下划线 |
可以看出,预定义类可以很方便的写出一些正则表达式
边界
字符 | 含义 |
---|---|
^ | 字符串以某某开头 |
$ | 字符串以某某结尾 |
\b | 单词边界 |
\B | 非单词边界 |
var str = "a00000";
console.log(str.match(/^a/)); //["a"] 以a开头
console.log(str.match(/^b/)); //null 字符串不是以b开头
console.log(str.match(/0$/)); //["0"] 以0结尾
console.log(str.match(/2$/)); //null 字符串不是以2结尾
量词
字符 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(最少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
var str1 = "http://jirengu.com";
console.log(str1.match(/https?:\/\/.+/)); //匹配
console.log(str1.match(/https+:\/\/.+/)); //不匹配
console.log(str1.match(/https*:\/\/.+/)); //匹配
var str2 = "https://jirengu.com";
console.log(str2.match(/https?:\/\/.+/)); //匹配
console.log(str2.match(/https+:\/\/.+/g)); //匹配
console.log(str2.match(/https*:\/\/.+/g)); //匹配
var str3 = "httpssssss://jirengu.com";
console.log(str3.match(/https?:\/\/.+/g)); //不匹配
console.log(str3.match(/https+:\/\/.+/g)); //匹配
console.log(str3.match(/https*:\/\/.+/g)); //匹配
由量词{n,m}
引发了一个问题,到底匹配了n次,还是m次,又或者是n+1次呢?
量词在默认下是尽可能多的匹配,也就是常说的贪婪模式
反之,尽可能少的匹配,为非贪婪模式,在量词后面加上?
即可
分组
()
提供了分组的功能
var reg1 = /abc{2}/;
var reg2 = /(abc){2}/;
上面代码里的两组正则表达式的意义完全不一样,reg1里的量词{2}
针对的是字符c
,而reg2里的量词{2}
针对的是abc
这个整体,使用()
,可以将()
里的内容当成一个整体,量词操作针对的就是这个整体了
前瞻
表达式 | 含义 |
---|---|
exp1(?=exp2) | 匹配后面是exp2的exp1 |
exp1(?!exp2) | 匹配后面不是exp2的exp1 |
通过标志进行高级搜索
标志 | 含义 |
---|---|
g | 全局搜索 |
i | 不区分大小写 |
m | 多行搜索,^ 和$ 匹配的开始或结束输入字符串中的每一行,而不是整个字符串的开始或结束 |
y | 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志 |