1.正则表达式
RegularExpression
通俗地讲:正则表达式就是记录文本规则的代码
Bigger的说法:正则表达式是一个描述字符模式的对象
2.元字符
\b 匹配单词的开始或结束
. 任意一个非换行字符
\d 任意一个数字字符
\w 任意一个数字,字母,下划线
\s 任意一个空白字符,包括空格,换行,制表符(Tab键)
^ 字符串的开始位置
$ 字符串的结束位置
* 前面的字符重复 0次或任意次
+ 前面的字符重复 1次或多次
? 前面的字符重复 0次或 1次
{n} 前面的字符重复n次
{n,m} 前面的字符重复n到m次,最小n次,最多m次
{n,} 前面的字符重复n次或更多次
3.字符类
[aeiou]、[0-9]、[a-z]、[a-zA-Z]
1.字符类中的 - 所代表的意义为:字符编码从 - 左边开始,到右边结束这个范围内的字符,被包含在字符类中
2.左边的字符编码要小于右边的字符编码,否则会报错
3.只能匹配一个字符
4.创建正则表达式
1.字面量创建
var telReg = /^0\d{2}-\d{8}$/;
var str = '024-31313131';
//0开头,2个/3个数字-8个数字
var telReg = /0\d{2,3}-\d{7,8}/;
// 除去字符串中的空格
var username = ' cui jn ';
username = username.replace(/\s+/g, '');
2.构造函数创建:
参数1:字符串,内容为正则表达式的内容.(如果遇到\d这种,\需要成对出现)
参数2:字符串,内容为正则表达式选项(“img”)//修饰符
var telReg2 = newRegExp("1[345678]\\d{9}",i)
//正则获取cookie值
function getCookie(name) {
var cookie = document.cookie;
var cookieReg = newRegExp(name + '=([^;]*)');// =后的一个非;字符
if(cookieReg.test(cookie)){
return RegExp.$1
} else {
return null;
}
}
5.选择
当要匹配多个字符串时,即这几种字符串都符合却又需要不同的正则表达式时,可以用 | ,将其隔开
//正则表示美国邮编,美国邮编规则是5位数字或者是用连字号隔开的9位数字:12934 、12478-5687
var postcodeReg = /\d{5}-\d{4}|\d{5}/
6.分组
当匹配单个字符重复时,可以在该字符后用 * + ? {n}等
那么匹配多个字符重复时,可以用 () 把需要重复的字符括起来
var str3 = 'wahahahahaha'
var reg3 = /^wa(ha){2,}$/
7.捕获
- 使用分组的()括起来的子表达式,其匹配的文本就是分组的捕获内容,(可以在表达式或其他程序中做进一步处理。)
- 默认情况,每个分组会自动获得一个组号。规则是,从左到右,以分组的左括号为标志,第一个出现左括号的分组为组号1,第二个为组号2,以此类推。
- 通过RegExp.$1访问第一个捕获组,RegExp.$2访问第二个捕获组。最多可以访问九个捕获组RegExp.$9
- 当调用正则表达式的test(),exec()时,会对这些值进行自动填充。
//后面捕获的捕获组值会对前面的RegExp.$1进行覆盖。
var str4 = '18041151259@163.com'
var reg4 = /(.*)@(.*)/
reg4.test(str4)
console.log(RegExp.$1); //18041151259
console.log(RegExp.$2); //163.com
8.反义
有时候需要查找不属于某个能简单定义的字符类的字符。。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义。
\W 匹配任意不是不是字母,数字,下划线的字符
\S 匹配任意不是空白符的字符
\D 匹配任意不是数字的字符【0-9】
\B 匹配不是单词开始或结束的字符
[^x] 匹配除了x以外的其他字符
9.贪婪
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。这被称为贪婪匹配。
🌰例如:正则 /a.*b/ ,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab
10.懒惰
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号 ?
🌰例如:/a.*?b/匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符) 和ab(第四到第五个字符)
懒惰限定符:
*? 重复任意次,但尽可能少的重复
+? 重复1到任意次,但尽可能少的重复
?? 重复0到1次,但尽可能少的少的重复
{n,m} 重复n到m次,但尽可能少的重复
{n,} 重复n次到n次以上,但尽可能少的重复。
11.选项(修饰符)
“i”:模式匹配不区分大小写
“g”:模式匹配时全局的
“m”:在多行模式下执行匹配。在这种模式下,^和$除了匹配字符串的首尾之外,还匹配每行的行首和行尾。
var str = '13912345678\n13812345678\n15912345678';
alert(str);
var telReg = /^1[2345678]\d{9}$/m
12.正则表达式对象的方法
1.myRegExp.test(str)
- 返回值:(Boolean)匹配返回true,否则返回false
-
2.myRegExp.exec (str)
参数: 待exec匹配的字符串
- 返回值:包含第一个匹配信息的数组;没有匹配返回null;若正则表达式中有用()分组,数组里还有分组的捕获内容
- 数组包含两个属性:index和input。index表示匹配项在字符串中的位置,input与参数的字符串相同。
- 对于exec()而言,即使设置了”g”选项,每次也只返回一个匹配项。
- 在不设置”g”选项时,在同一个字符串上多次调用exec()将始终返回第一个匹配项。
在设置了”g”选项时,每次调用exec()则都会在字符串中继续查找新匹配项
var tels = '13912345678;13587654321;13487651234;13487651235';
var reg = /((1[345678])(\d{9}))/g;
var array = reg.exec(tels);
console.log(array);
//["13912345678", "13912345678", "13", "912345678", index: 0, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
array = reg.exec(tels);
console.log(array);
//["13587654321", "13587654321", "13", "587654321", index: 12, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
array = reg.exec(tels);
console.log(array);
//["13487651234", "13487651234", "13", "487651234", index: 24, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
array = reg.exec(tels);
console.log(array);
//["13487651235", "13487651235", "13", "487651235", index: 36, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
13某些支持正则表达式的字符串方法
1.str.search(regExp)
- 参数: 正则表达式,表示要搜索的内容
- 返回值:返回第一个匹配的子字符串的位置
- 注意:这个函数,会忽略正则表达式的“g”选项
var str2 = 'laylayfgayhfayay'
console.log(str2.search(/.ay/)); //0
2.str.replace(regExp, string)
1.参数:regExp:正则表达式,表示要被替换的内容
string:字符串,表示参数1要替换成的内容
2.返回值:替换之后的字符串
var str2 = 'laylayfgayhfayay'
console.log(str2.replace(/.*?ay.*?/,'yx')) //yxlayfgayhfayay,不加全局 g,只替换找到的第一个
3.str.match(regExp)
- 参数:regExp:正则表达式,表示要匹配的内容
- 返回值:由匹配结果组成的数组,
- 如果参数的正则设置了’g’,数组会包含所有的匹配结果。
如果不设置’g’选项,match不会进行全局搜索。此时数组第一个元素是匹配的字符串,余下的元素是分组捕获的内容。
var msg = 'hello world';
var reg = /(h)ello (world)/
var arr = msg.match(reg);
console.log(arr) //["hello world", "h", "world", index: 0, input: "hello world", groups: undefined]
var reg = /(h)ello (world)/g
console.log(arr) // ["hello world"]