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.字面量创建

  1. var telReg = /^0\d{2}-\d{8}$/;
  2. var str = '024-31313131';
  3. //0开头,2个/3个数字-8个数字
  4. var telReg = /0\d{2,3}-\d{7,8}/;
  5. // 除去字符串中的空格
  6. var username = ' cui jn ';
  7. username = username.replace(/\s+/g, '');

2.构造函数创建:

参数1:字符串,内容为正则表达式的内容.(如果遇到\d这种,\需要成对出现)
参数2:字符串,内容为正则表达式选项(“img”)//修饰符

  1. var telReg2 = newRegExp("1[345678]\\d{9}",i)
  2. //正则获取cookie值
  3. function getCookie(name) {
  4. var cookie = document.cookie;
  5. var cookieReg = newRegExp(name + '=([^;]*)');// =后的一个非;字符
  6. if(cookieReg.test(cookie)){
  7. return RegExp.$1
  8. } else {
  9. return null;
  10. }
  11. }

5.选择

当要匹配多个字符串时,即这几种字符串都符合却又需要不同的正则表达式时,可以用 | ,将其隔开

  1. //正则表示美国邮编,美国邮编规则是5位数字或者是用连字号隔开的9位数字:12934 、12478-5687
  2. var postcodeReg = /\d{5}-\d{4}|\d{5}/

6.分组

当匹配单个字符重复时,可以在该字符后用 * + ? {n}等
那么匹配多个字符重复时,可以用 () 把需要重复的字符括起来

  1. var str3 = 'wahahahahaha'
  2. var reg3 = /^wa(ha){2,}$/

7.捕获

  1. 使用分组的()括起来的子表达式,其匹配的文本就是分组的捕获内容,(可以在表达式或其他程序中做进一步处理。)
  2. 默认情况,每个分组会自动获得一个组号。规则是,从左到右,以分组的左括号为标志,第一个出现左括号的分组为组号1,第二个为组号2,以此类推。
  3. 通过RegExp.$1访问第一个捕获组,RegExp.$2访问第二个捕获组。最多可以访问九个捕获组RegExp.$9
  4. 当调用正则表达式的test(),exec()时,会对这些值进行自动填充。
    1. //后面捕获的捕获组值会对前面的RegExp.$1进行覆盖。
    2. var str4 = '18041151259@163.com'
    3. var reg4 = /(.*)@(.*)/
    4. reg4.test(str4)
    5. console.log(RegExp.$1); //18041151259
    6. 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”:在多行模式下执行匹配。在这种模式下,^和$除了匹配字符串的首尾之外,还匹配每行的行首和行尾。

  1. var str = '13912345678\n13812345678\n15912345678';
  2. alert(str);
  3. var telReg = /^1[2345678]\d{9}$/m

12.正则表达式对象的方法

1.myRegExp.test(str)

  1. 返回值:(Boolean)匹配返回true,否则返回false
  2. test()的功能,就是看一个字符串,是否符合这个规则

    2.myRegExp.exec (str)

  3. 参数: 待exec匹配的字符串

  4. 返回值:包含第一个匹配信息的数组;没有匹配返回null;若正则表达式中有用()分组,数组里还有分组的捕获内容
  5. 数组包含两个属性:index和input。index表示匹配项在字符串中的位置,input与参数的字符串相同。
  6. 对于exec()而言,即使设置了”g”选项,每次也只返回一个匹配项。
  7. 在不设置”g”选项时,在同一个字符串上多次调用exec()将始终返回第一个匹配项。

在设置了”g”选项时,每次调用exec()则都会在字符串中继续查找新匹配项

  1. var tels = '13912345678;13587654321;13487651234;13487651235';
  2. var reg = /((1[345678])(\d{9}))/g;
  3. var array = reg.exec(tels);
  4. console.log(array);
  5. //["13912345678", "13912345678", "13", "912345678", index: 0, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
  6. array = reg.exec(tels);
  7. console.log(array);
  8. //["13587654321", "13587654321", "13", "587654321", index: 12, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
  9. array = reg.exec(tels);
  10. console.log(array);
  11. //["13487651234", "13487651234", "13", "487651234", index: 24, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]
  12. array = reg.exec(tels);
  13. console.log(array);
  14. //["13487651235", "13487651235", "13", "487651235", index: 36, input: "13912345678;13587654321;13487651234;13487651235", groups: undefined]

13某些支持正则表达式的字符串方法

1.str.search(regExp)

  1. 参数: 正则表达式,表示要搜索的内容
  2. 返回值:返回第一个匹配的子字符串的位置
  3. 注意:这个函数,会忽略正则表达式的“g”选项
    1. var str2 = 'laylayfgayhfayay'
    2. console.log(str2.search(/.ay/)); //0

2.str.replace(regExp, string)

1.参数:regExp:正则表达式,表示要被替换的内容
string:字符串,表示参数1要替换成的内容
2.返回值:替换之后的字符串

  1. var str2 = 'laylayfgayhfayay'
  2. console.log(str2.replace(/.*?ay.*?/,'yx')) //yxlayfgayhfayay,不加全局 g,只替换找到的第一个

3.str.match(regExp)

  1. 参数:regExp:正则表达式,表示要匹配的内容
  2. 返回值:由匹配结果组成的数组,
  3. 如果参数的正则设置了’g’,数组会包含所有的匹配结果。

如果不设置’g’选项,match不会进行全局搜索。此时数组第一个元素是匹配的字符串,余下的元素是分组捕获的内容。

  1. var msg = 'hello world';
  2. var reg = /(h)ello (world)/
  3. var arr = msg.match(reg);
  4. console.log(arr) //["hello world", "h", "world", index: 0, input: "hello world", groups: undefined]
  5. var reg = /(h)ello (world)/g
  6. console.log(arr) // ["hello world"]