正则语法
正则表达式的创建方式
使用正则表达式字面量,用两个
/
来表示 ,/正则表达式/
var reg = /abc/
使用RegExp对象的构造函数,new RegExp("正则表达式",“imgs”)
第一个参数 是 正则表达式 , 第二个参数 是 后缀修饰符
var reg= new RegExp("abc")
正则表达式的组成
由一些普通字符和一些特殊字符(又叫元字符--metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。
特殊字符:javascript 中常用特殊字符有 ( ) [ ] { } \ ^ $ | ? * .+
如果正则表达式中包含以上的特殊字符, 则需要使用 转义符 \
对其进行转义,如: \(
,\^
,\\
预定义特殊字符:
\t
制表符
\n
回车符
\f
换页符
\b
空格
正则表达式字符集
- 最简单的正则
关键字原文
/abc/
-----> 匹配的是 "abc"
备选字符集 ---[]
某一个可用的备选字符列表,使用[备选的字符列表]
var str = "out ont o1t ";
console.log(str.match(/o[usb]t/g)); // ["out"]
- 连续备选字符
若备选的字符列表太多,且类型相同,全部输入太麻烦,可以在 中间加了个横线-
,将字符连起来,如[a-z]、[0-9]、[A-Z]、[0-9a-z]
var str = "out ont o1t ";
console.log(str.match(/o[0-9a-z]t/g)); // ["out", "ont", "o1t"]
- 反向: [] 前面加个元字符进行取反,表示匹配不能为括号里面的字符。[^0-9] --->除去0-9的关键字符
var str = "out ont o1t ";
console.log(str.match(/o[^0-9]t/g)); // ["out", "ont"]
一个中括号,只能匹配到一个字符
预定义备选字符集
\d
---------> [0-9]
\w
---------> [0-9a-zA-Z]
\s
---------> [ \t\n\x0B\f\r] 匹配所有的空字符,如:空格、制表符、换行
.
---------> [^\n\r] 除了换行和回车 后的任意字符
\D ---------> [^0-9] 非数字字符
\W ---------> [^a-zA-Z_0-9] 非单词字符
\S ---------> [^ \t\n\x0B\f\r] 非空白字符
[\u4e00-\u9fa5] -----> 中文字符集
量词 ---{}
规定相邻的前一个字符集出现的次数
写法 | 含义 |
---|---|
{n} | 必须n次 |
{n,m} | 至少出现 n 次但不超过 m 次(中间不能有空格) |
{n,} | 至少出现n次(+的升级版) |
? | 出现零次或一次(最多一次) |
* | 出现零次或多次(任意次) |
+ | 出现一次或多次(至少一次) |
分组 ---()
分组,在正则表达式中用()包裹起来的内容代表一个分组
- 分组的反向引用
- 正则表达式中的每个(),都是一个子表达式,每个子表达式都会自动获得一个从 1 开始的编号
- 在正则表达式内部,可用
\
编号 形式 来表示 分组中的第i个子表达式匹配到的内容,如/(a)\1/
--> 表示匹配 字符为aa 的内容- 而在正则表达式外,可用n,常用于replace()方法中
$的表示方式
- $i:(i取值范围1~99),表示从左到右正则子表达式所匹配的内容
- $&:表示与正则表达式匹配的全部内容
- $`: ($ + `,反引号):表示匹配字符串的左边内容
- $':($ + ' 单引号),表示匹配字符串的右边内容
var date = "20201225一下065959";
var reg = /(\d{4})(\d{2})(\d{2})([\u4e00-\u9fa5])([\u4e00-\u9fa5])(\d{2})(\d{2})(\d{2})/;
// 2020 12 25 一 下 06 59 59
// $1 $2 $3 $4 $5 $6 $7 $8
date = date.replace(reg, "$1年$2月$3日 星期$4 $5午 $6:$7:$8");
console.log(date)
var dateStr = '2020-12-25';
var reg = /(\d{4})-(\d{2})-(\d{2})/;
console.log(reg.test(dateStr)); //true
console.log(RegExp.$1) //2020
console.log(RegExp.$2) //12
console.log(RegExp.$3) //25
选择 ---|
字符 |
用于分隔供选择的字符,可理解为 “或”,表示在多个选择项中选择一个,在正则的优先级中非常低
- 匹配选择的规则
选择项是从左到右考虑,直到发现了匹配项。如果左边的选择项匹配,则忽略右边的匹配项,即使它产生更好的匹配。
边界 --- ^
或 $
^
匹配开始位置 (注意与[^]区分开)
表示限制开头,后面的正则内容匹配的结果必须出现在字符串开始$
匹配结束位置
表示限制结尾,前面的正则内容匹配的结果必须出现在字符串结尾前加
^
后加$
,且中间没有|
, 表示同时限制开头和结尾,中间的字符必须与正则表达式完全匹配\b
: 表示单词的边界 如:\bno\b
只匹配单词no,如果匹配独立的单词,则两边同时加\b
正则表达式 后缀修饰符
g
--->(global) 修饰符用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
i
--->(ignore case)修饰符用于执行对大小写不敏感的匹配
m
--->(multiline)修饰符用于多行模式执行的匹配(若正则表达式没有^
或$
匹配字符串的开头或结尾,那么/m
修饰符没有任何意义)
s
---> (singleline),dotAll标志,匹配任意字符,包括换行,解决.
匹配的缺点(除了换行和回车 后的任意字符),与m
不同,m
只影响^
和$
,而s
只影响.
相关的正则方法
字符串的方法
split()
根据匹配字符串切割父字符串
// 通过空格字符串进行分割
var str = "aa bbb c dd eeeeee";
console.log(str.split(/\s+/)); // ["aa", "bbb", "c", "dd", "eeeeee"]
search()
对正则表达式或指定字符串进行搜索,返回第一个出现的匹配项的下标。如果未找到,则返回 -1
// 查询子串在父字符串中出现的位置
var str = "abcdefg";
console.log(str.search(/cd/)); // 2
console.log(str.search(/cdf/)); // -1
match()
使用正则表达式与字符串相比较,返回一个包含匹配结果的数组
默认是只返回第一个找到的关键词就结束
在正则表达式后 加上后缀 g
,能够匹配到所有关键词的 数组
如果未找到,则返回null
在使用此方法时,需要先判断匹配的结果kwords是否为 null,再对结果进行使用数组的相关方法,如 kwords.length
// 在父字符串中去匹配符合的子字符串
var str = "abbcccbbbbbddbbbdabbb";
console.log(str.match(/b+/)); // ["bb"]
console.log(str.match(/b+/g)); // ["bb", "bbbbb", "bbb", "bbb"]
replace()
用正则表达式和字符串直接比较,然后用新的子串来替换被匹配的子串
默认匹配第一个符合的子串 就结束
匹配所有符合的关键词,需要加 后缀 g
// 替换字符串的指定部分,返回值是一个新的替换后的字符串
var str = "aa abb acc add";
console.log(str.replace(/a+/,"A")); // "A abb acc add"
console.log(str.replace(/a+/g,"A")); // "A Abb Acc Add"
RegExp对象的方法
exec()
查找匹配的字符串,输出到数组中,既获得每个关键字的内容,又获得每个关键字的位置,但只会在找到第一个之后直接中止。
形如: var arr = reg.exec(str);
,表示从str中查找符合reg要求的关键词的位置和内容,并保存在数组arr中
特点
- 返回的结果为数组,每次只返回一个关键字的内容,新的关键字替换上一个,保存在arr[0]中,如果找不到,则返回null
- 将本次找到的关键字的位置保存在arr.index中
- 自动调整,reg.lastIndex属性为下次开始的查找位置(默认从0开始),因此每个关键字都是arr[0],因为会被替换
因此,根据以上exec()存在的特点,可以通过 循环遍历使用该方法来获取所有符合关键字的内容(需要加后缀修饰符
g
)
test()
检测字符串中是否满足正则表达式的匹配规则,返回值是布尔值
形如:reg.test(str);
,如果str符合reg的要求,则返回 true,表示验证通过,否则为false,验证失败
一般在做验证中,会配合
^
和$
一起使用,否则会出现 局部匹配 就验证通过的情况
深入学习正则表达式,推荐看这本书《JavaScript 正则迷你书》