正则表达式概述
正则表达式(Regular Expression)是一种用于匹配文本内容的模式,使用一些特殊字符和语法规则来描述和匹配字符串的规律。在JavaScript中,使用RegExp对象来表示正则表达式,可以通过构造函数创建正则表达式。
//创建正则表达式
var regex = new RegExp("hello", "gi"); //匹配字符串中所有的hello(不区分大小写)
var regex2 = /hello/gi; //使用字面量创建正则表达式,与上面的语句等价
在JavaScript中,正则表达式常用的方法有test()和exec()。test()方法返回一个布尔值,表示字符串是否匹配这个正则表达式,exec()方法返回一个数组,数组的第一个元素是匹配到的字符串,接下来的元素是每个括号分组捕获的字符串。
test()方法
test()方法用于测试一个字符串是否匹配某个正则表达式,返回一个布尔值。该方法不会改变RegExp对象的lastIndex属性。
var regex=/hello/;
var str="hello world!";
if(regex.test(str)){
console.log("匹配成功");
}else{
console.log("匹配失败");
}
上述代码中,test()方法返回true,因为字符串中包含了"hello"。
exec()方法
exec()方法在字符串中查找匹配的正则表达式,返回一个数组,数组的第一个元素是匹配到的字符串,接下来的元素是每个括号分组捕获的字符串。如果没有匹配到,返回null。
var regex=/hello (\w+)/;
var str="hello world!";
var result=regex.exec(str);
console.log(result[0]); //"hello world!"
console.log(result[1]); // "world"
上述代码中,正则表达式/ hello (\w+)/匹配了"hello "之后的单词,exec()方法返回了一个数组,其中第一个元素是"hello world!"字符串,第二个元素是捕获的单词"world"。
常用正则表达式技巧
1、匹配数字
匹配数字可以使用\d,表示匹配任意数字,可以使用+或者*表示匹配1个或多个数字,或者0个或多个数字。
var regex = /\d+/;
console.log(regex.test('123')); // true
console.log(regex.test('abc')); // false
上述代码中,使用\d+来匹配数字,可以匹配到字符串"123",因为它包含了1个或多个数字。而对于字符串"abc",则匹配失败,因为不包含任何数字。
2、匹配邮箱
匹配邮箱可以使用一些特殊字符和语法规则。一个常用的方式是使用正则表达式/[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+/。
var regex = /^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/;
console.log(regex.test('abc123@example.com')); // true
console.log(regex.test('example.com')); //false
上述代码中,使用了^和$表示匹配字符串的开头和结尾,中间的部分用正则表达式/[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+/来匹配邮箱的格式。如果不符合邮箱的格式,test()方法会返回false。
3、替换字符串
JavaScript中可以使用replace()方法来替换字符串中的内容。replace()方法接收两个参数,第一个参数是要替换的内容,可以是一个字符串或正则表达式,第二个参数是替换成的内容,可以是一个字符串或者一个函数。
var str = 'abc123def456';
console.log(str.replace(/\d+/g, '')); // "abcdef"
上述代码中,使用正则表达式/\d+/g匹配字符串中的所有数字,然后使用空字符串替换这些数字,最终结果是"abcdef"。
高级正则表达式技巧
1、贪婪模式与非贪婪模式
在正则表达式中,有贪婪模式和非贪婪模式。贪婪模式表示尽可能多地匹配内容,而非贪婪模式表示尽可能少地匹配内容。默认情况下,正则表达式使用贪婪模式。
var str = 'ace';
console.log(str.match(/<.+>/g)); // ['ce']
console.log(str.match(/<.+?>/g)); // ['', '', '']
上述代码中,使用正则表达式/<.+>/g,匹配字符串中的所有标签,结果是" c
2、捕获分组
在正则表达式中,使用()来进行分组,可以将匹配到的内容进行捕获。在exec()方法返回的数组中,除了第一个元素是匹配到的字符串之外,其他的元素是每个括号分组捕获的字符串。
var regex = /(\d{4})-(\d{2})-(\d{2})/;
var str = '2022-08-18';
var groups = regex.exec(str);
console.log(groups); //["2022-08-18", "2022", "08", "18"]
console.log(groups[1]); // "2022"
console.log(groups[2]); // "08"
console.log(groups[3]); // "18"
上述代码中,使用正则表达式/(\d{4})-(\d{2})-(\d{2})/,将日期字符串按照年、月、日分组,使用exec()方法匹配字符串,返回一个数组。数组的第一个元素是匹配到的整个字符串,后面的元素是每个括号分组捕获的字符串。
3、标志
在JavaScript中,可以使用标志对正则表达式进行调整,常用的标志有i、g、m。
"i"标志表示不区分大小写
"g"标志表示全局匹配
"m"标志表示多行匹配
var regex = /hello/gi;
var str = 'Hello World! hello javascript!';
console.log(str.match(regex)); //["Hello", "hello"]
上述代码中,使用正则表达式/hello/gi,匹配字符串中所有的"hello",即不区分大小写地匹配"hello"。使用match()方法匹配字符串,返回一个数组,其中包含了所有匹配的字符串。
总结
正则表达式是一种用于匹配文本内容的模式,了解正则表达式可以方便地进行字符串匹配和替换操作。在JavaScript中,使用RegExp对象来表示正则表达式,test()方法和exec()方法常用于对字符串进行匹配。使用正则表达式时,需要了解常用的格式和语法规则,并且注意哪些地方有贪婪模式和非贪婪模式的区别。对于复杂的正则表达式,可以使用标志和分组来进行调整,以满足匹配的需求。