8.0 KiB
正则表达式简介
定义:正则表达式用于定义一些字符串的规则。
作用:计算机可以根据正则表达式,来检查一个字符串是否符合指定的规则;或者将字符串中符合规则的内容提取出来。
如果你想查看正则更多的内容,可以查阅官方文档关于 RegExp 这个内置对象的用法。
创建正则表达式的对象
方式一:使用构造函数创建
语法:
var 变量 = new RegExp("正则表达式"); // 注意,参数是字符串
var 变量 = new RegExp("正则表达式", "匹配模式"); // 注意,两个参数都是字符串
备注:RegExp
的意思是 Regular expression。使用typeof检查正则对象,会返回object。
上面的语法中,既可以传一个参数,也可以传两个参数。
创建了正则表达式的对象后,该怎么使用呢?大致分为两个步骤:
-
(1)创建正则表达式的对象 reg。
-
(2)使用 reg 的test() 方法,判断指定字符串是否符合规则。
我们来看看下面的例子。
1、传一个参数时:
构造函数 RegExp 中,可以只传一个参数。
代码举例:
var reg = new RegExp("a"); // 定义一个正则表达式:检查一个字符串中是否含有 a
var str1 = "qianguyihao";
var str2 = "smyh";
// 通过 test()方法,判断字符串是否符合 上面定义的 reg 规则
console.log(reg.test(str1)); // 打印结果:true
console.log(reg.test(str2)); // 打印结果:false
注意,上面的例子中,我们是先定义了一个正则表达式的规则,然后通过正则表达式的test()
方法来判断字符串是否符合之前定义的规则。
正则表达式的test()
方法:
myReg.test(str); // 判断字符串 str 是否符合 指定的 myReg 这个正则表达式的规则
解释:使用test()
这个方法可以用来检查一个字符串是否符合正则表达式的规则,如果符合则返回true,否则返回false。
2、传两个参数时:匹配模式
构造函数 RegExp 中,也可以传两个参数。我们可以传递一个匹配模式作为第二个参数。这个参数可以是:
-
i
忽略大小写。这里的 i 指的是 ignore。 -
g
全局匹配模式。这里的 g 指的是 global。
代码举例:
var reg = new RegExp('A', 'i');
var str = 'qiangu';
console.log(reg.test(str)); // 打印结果:true
方式二:使用字面量
我们可以使用字面量来创建正则表达式。
语法:
var 变量 = /正则表达式/; // 注意,这个语法里没有引号
var 变量 = /正则表达式/匹配模式; // 注意,这个语法里没有引号
语法举例:
var reg = new RegExp("a", "i"); // 方式一
var reg = /a/i; // 方式二
上面这两行代码的作用是等价的。
以上两种方式的对比:
-
方式一:使用构造函数创建时,更加灵活,因为参数中还可以传递变量。
-
方式二:使用字面量的方式创建,更加简单。
代码举例:
var reg = /A/i; // 定义正则表达式的规则
var str = "qiangu";
console.log(typeof reg); // 打印结果:object
console.log(reg.test(str)); // 打印结果:true
正则表达式的常见语法
检查一个字符串中是否包含 a或b
语法1:
var reg = /a|b/;
解释:使用 |
表示或
的意思。
语法2:
var reg = /[ab]/; // 跟上面的那行语法,是等价的
解释:这里的[]
也是表示或
的意思。
[]
这个符号在正则还是比较常用的。我们接下来看几个例子。
[]表示:或
一些规则:
-
/[ab]/
等价于/a|b/
:检查一个字符串中是否包含 a或b -
/[a-z]/
:检查一个字符串那种是否包含任意小写字母 -
/[A-Z]/
:任意大写字母 -
/[A-z]/
:任意字母 -
/[0-9]/
:任意数字 -
/a[bde]c/
:检查一个字符串中是否包含 abc 或 adc 或 aec
[^ ] 表示:除了
举例1:
var reg = /[^ab]/; // 规则:字符串中,除了a、b之外,还有没有其他的字符内容
var str = "acb";
console.log(reg.test(str)); // 打印结果:true
举例2:(可以用来验证某字符串是否为 纯数字)
var reg = /[^0-9]/; // 规则:字符串中,除了数字之外,还有没有其他的内容
var str1 = "1991";
var str2 = "199a1";
console.log(reg.test(str1)); // 打印结果:false (如果字符串是 纯数字,则返回 false)
console.log(reg.test(str2)); // 打印结果:true
支持正则表达式的 String 对象的方法
String对象的如下方法,是支持正则表达式的:
方法 | 描述 | 备注 |
---|---|---|
split() | 将字符串拆分成数组 | |
search() | 搜索字符串中是否含有指定内容 | |
match() | 根据正则表达式,从一个字符串中将符合条件的内容提取出来 | |
下面来分别举例。
split()
举例:根据任意字母,将字符串拆分成数组。
代码实现:(通过正则)
var str = "1a2b3c4d5e6f7g";
var result = str.split(/[A-z]/);
console.log(result);
打印结果:
["1", "2", "3", "4", "5", "6", "7", ""]
search()
search()
:搜索字符串中是否含有指定内容。如果搜索到指定内容,则会返回第一次出现的索引;否则返回-1。
search()
方法可以接受一个正则表达式作为参数,然后会根据正则表达式去检索字符串。serach()
只会查找第一个,即使设置全局匹配也没用。
举例:
var str = "hello abc hello aec afc";
/*
* 搜索字符串中是否含有abc 或 aec 或 afc
*/
result = str.search(/a[bef]c/);
console.log(result); // 打印结果:6
match()
match()
:根据正则表达式,从一个字符串中将符合条件的内容提取出来,封装到一个数组中返回(即使只查询到一个结果)。
注意:默认情况下,match()
方法只会找到第一个符合要求的内容,找到以后就停止检索。我们可以设置正则表达式为全局匹配模式,这样就会匹配到所有的内容。
另外,我们可以为一个正则表达式设置多个匹配模式,且顺序无所谓。
代码举例:
var str = "1a2a3a4a5e6f7A8B9C";
var result1 = str.match(/[a-z]/); // 找到符合要求的第一个内容,然后返回
var result2 = str.match(/[a-z]/g); // 设置为“全局匹配”模式,匹配字符串中所有的内容
var result3 = str.match(/[a-z]/gi); // 设置多个匹配模式,且顺序无所谓
console.log(result1); // 打印结果:["a"]
console.log(result2); // 打印结果:["a", "a", "a", "a", "e", "f"]
console.log(result3); // 打印结果:["a", "a", "a", "a", "e", "f", "A", "B", "C"]
总结:
match()这个方法还是很实用的,可以在一个很长的字符串中,提取出有规则的内容。这不就是爬虫的时候经常会遇到的场景么?
replace
replace()
:将字符串中的指定内容,替换为新的内容并返回。不会修改原字符串。
语法:
新的字符串 = str.replace(被替换的内容,新的内容);
参数解释:
-
被替换的内容:可以接受一个正则表达式作为参数。
-
新的内容:默认只会替换第一个。如果需要替换全部符合条件的内容,可以设置正则表达式为全局匹配模式。
代码举例:
代码举例:
//replace()方法:替换
var str2 = "Today is fine day,today is fine day !!!"
console.log(str2);
console.log(str2.replace("today","tomorrow")); //只能替换第一个today
console.log(str2.replace(/today/gi,"tomorrow")); //这里用到了正则,且为“全局匹配”模式,才能替换所有的today