正则表达式
正则表达式是国际标准,跨越语言
正则表达式是一个规则,用于验证字符串。
基础
- 字面量匹配
规则中直接书写字面量字符
- 特殊字符
.
^
$
- 转义符
\n
\r
\t
\s
\S
\b
\B
\d
\D
\w
\W
\u
转义符可以将特殊字符转义
- 字符集
[字符范围]
匹配中文: [\u4e00-\u9FA5]
- 量词
前面的规则出现的次数
*
+
?
{n}: 匹配n个
{n,}: 匹配>=n个
{n,m}: 匹配n-m个
JS中的应用
js中,正则表达式表现为一个对象,该对象是通过构造函数RegExp
创建正则对象
- 字面量模式
- 构造函数模式
规则固定一般用第一种,规则会改变或者用户输入用第二种
var reg = /\d+?/g;
var reg1=new RegExp("\d+?")
正则实例成员
- global
- ignoreCase
- multiline
- source
- test方法:验证某个字符串是否满足规则
- exec方法:execute,执行匹配,得到匹配结果。
var reg = /\d+/g;
var s = "1234abc123aaa";
//得到所有的匹配结果和位置
while (result = reg.exec(s)) {
console.log(`匹配结果:${result[0]},出现位置:${result.index}`);
}
//判断匹配多少处
// var n = 0;
// while (reg.test(s)) {
// n++;
// }
// console.log(`匹配了${n}次`);
正则表达式,默认情况下,适用贪婪模式
在量词后,加上?,表示进入非贪婪模式
字符串对象中的正则方法
- split:通过分离字符串成字串,将字符串对象分割成字符串数组。
- replace:返回指定重复次数的由元素组成的字符串对象
- search:对正则表达式和指定字符串进行匹配搜索,返回第一个出现的匹配项的下标。
- match:使用正则表达式与字符串相比较。
// 去掉空白字符,首字母大写
var s = "hello world\tjavascript\nyes";
s = s.replace(/\s*\b[a-z]\s*/g, function(match){
return match.toUpperCase().trim();
});
console.log(s);
//HelloWorldJavascriptYes
//将空白字符替换为逗号
s = "hello world\tjavascript\nyes";
s=s.replace(/\s/g,",")
console.log(s);
//hello,world,javascript,yes
// 按照逗号、空格、横杠、制表符进行分割
s = "hello world\tjavascript\nyes";
var result = s.split(/[, \-\s]/);
console.log(s, result);
//["hello", "world", "javascript", "yes"]
s = "1212a3232a323";
var result = s.match(/\d+/g)
console.log(s, result);
// ["1212", "3232", "323"]
s = "1212a3232a323";
var result = s.search(/\d+/g)
console.log(s, result);
// 1212a3232a323 0
进阶
捕获组
用小括号包裹的部分叫做捕获组,捕获组会出现在匹配结果中
var reg = /(\d[a-z])([a-z]+)/g;
var s = "2afsdf-5fdgdfg-9asddf";
while (result = reg.exec(s)) {
console.log(result);
}
捕获组可以命名,叫做具名捕获组
// 给捕获组加上名字
var s = "2015-5-1, 2019-6-19, 2000-04-28";
//得到每一个日期,并得到每个日期的年月日
var reg = /(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})/g;
while (result = reg.exec(s)) {
console.log(result.groups,result.groups.year,result.groups.month,result.groups.day);
}
非捕获组
var s = "2015-5-1, 2019-6-19, 2000-04-28";
//得到每一个日期,并得到每个日期的年月日
var reg = /(?:\d{4})-(?:\d{1,2})-(?:\d{1,2})/g;
反向引用
在正则表达式中,使用某个捕获组,\捕获组编号
正向断言(预查)
检查某个字符后面的字符是否满足某个规则,该规则不成为匹配结果,并且不称为捕获组
负向断言(预查)
检查某个字符后面的字符是否不满足某个规则,该规则不成为匹配结果,并且不称为捕获组