1 正则表达式

1.1 什么是正则表达式

正则表达式是用于匹配规律规则的表达式,它的“鼻祖”可一直追溯到科学家对人类神经系统的工作原理的早期研究。现在在各种编程语言中,正则表达式都有广泛的应用。在JavaScript中,正则表达式也是对象,正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

1.2 正则表达式的作用

  1. 给定的字符串是否符合正则表达式的过滤逻辑(匹配)。
  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分(提取)。
  3. 强大的字符串替换能力(替换)。

1.3 正则表达式的特点

  1. 灵活性、逻辑性和功能性非常的强
  2. 可以迅速地用极简单的方式达到字符串的复杂控制
  3. 对于刚接触的人来说,比较晦涩难懂

1.4 正则表达式的组成

  • 普通字符
  • 特殊字符(元字符):正则表达式中有特殊意义的字符

示例演示:

  • \d 匹配数字
  • ab\d 匹配 ab1、ab2

1.5 元字符串

1.5.1 常用元字符串

元字符说明
\d匹配数字
\D匹配任意非数字的字符
\w匹配字母或数字或下划线
\W匹配任意不是字母,数字,下划线
\s匹配任意的空白符
\S匹配任意不是空白符的字符
.匹配除换行符以外的任意单个字符
^表示匹配行首的文本(以谁开始)
$表示匹配行尾的文本(以谁结束)

1.5.2 限定符

限定符说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

1.5.3 其它

1.[] 字符串用中括号括起来,表示匹配其中的任一字符,相当于或的意思。
2.[^] 匹配中括号以外的内容,相当于非的意思。
3.\ 转义符。
4.| 或者,选择两者中的一个。注意|将左右两边分为两部分,而不管左右两边有多长多乱。
5.() 从两个直接量中选择一个,分组。 eg:gr(a|e)y匹配gray和grey。
6.[\u4e00-\u9fa5] 匹配汉字。

2 常用正则表达式

验证手机号:

^\d{11}$

验证邮编:

^\d{6}$

验证日期 2012-5-01:

^\d{4}-\d{1,2}-\d{1,2}$

验证邮箱 xxx@qq.cn:

^\w+@\w+\.\w+$

验证IP地址 192.168.1.10

^\d{1,3}\(.\d{1,3}){3}$

3 在JavaScript 中使用正则表达式

3.1 创建正则表达式对象

在 JavaScript 中,有两种方式创建正则表达式对象。

3.1.1 方式1

  1. var reg = new Regex('\d', 'i');
  2. var reg = new Regex('\d', 'gi');

3.1.2 方式2

  1. var reg = /\d/i;
  2. var reg = /\d/gi;

3.2 参数

标志说明
i忽略大小写
g全局匹配
gi全局匹配+忽略大小写

3.3 正则表达式匹配

匹配日期:

  1. // 匹配日期var dateStr = '2020-10-24';
  2. var reg = /^\d{4}-\d{1,2}-\d{1,2}$/console.log(reg.test(dateStr)); // true

3.4 实例

3.4.1 验证密码强弱

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>密码强弱:公众号AlbertYang</title>
  6. </head>
  7. <style type="text/css">
  8. #dv {
  9. width: 300px;
  10. height: 200px;
  11. position: absolute;
  12. left: 300px;
  13. top: 100px;
  14. }
  15. .strengthLv0 {
  16. height: 6px;
  17. width: 40px;
  18. border: 1px solid #ccc;
  19. padding: 2px;
  20. }
  21. .strengthLv1 {
  22. background: red;
  23. height: 6px;
  24. width: 40px;
  25. border: 1px solid #ccc;
  26. padding: 2px;
  27. }
  28. .strengthLv2 {
  29. background: orange;
  30. height: 6px;
  31. width: 80px;
  32. border: 1px solid #ccc;
  33. padding: 2px;
  34. }
  35. .strengthLv3 {
  36. background: green;
  37. height: 6px;
  38. width: 120px;
  39. border: 1px solid #ccc;
  40. padding: 2px;
  41. }
  42. </style>
  43. <body>
  44. <div id="dv">
  45. <label for="pwd">密码</label>
  46. <input type="text" id="pwd" maxlength="16">
  47. <div>
  48. <em>密码强度:</em>
  49. <span id="strength"></span>
  50. <div id="strengthLevel" class="strengthLv0"></div>
  51. </div>
  52. </div>
  53. <script>
  54. // 获取文本框注册键盘抬起事件
  55. document.getElementById("pwd").onkeyup = function() {
  56. // 每次键盘抬起都要获取文本框中的内容,验证文本框中有什么东西,得到一个级别,然后下面的div显示对应的颜色
  57. // 如果密码的长度是小于6的,不判断
  58. let level = getLvl(this.value),
  59. levelStr = "弱";
  60. if (level === 2) {
  61. levelStr = "中等";
  62. } else if (level === 3) {
  63. levelStr = "强";
  64. }
  65. if (this.value.length >= 6) {
  66. document.getElementById("strengthLevel").className = "strengthLv" + level;
  67. document.getElementById("strength").innerHTML = levelStr;
  68. } else {
  69. document.getElementById("strengthLevel").className = "strengthLv0";
  70. document.getElementById("strength").innerHTML = "";
  71. }
  72. };
  73. // 根据密码返回对应的级别
  74. function getLvl(pwd) {
  75. let lvl = 0; // 默认是0级
  76. // 判断密码中是否有数字
  77. if (/[0-9]/.test(pwd)) {
  78. lvl++;
  79. }
  80. // 判断密码中有没有字母
  81. if (/[a-zA-Z]/.test(pwd)) {
  82. lvl++;
  83. }
  84. // 判断密码中是否有特殊符号
  85. if (/[^0-9a-zA-Z_]/.test(pwd)) {
  86. lvl++;
  87. }
  88. return lvl; // 最小值是1,最大值是3
  89. }
  90. </script>
  91. </body>
  92. </html>

3.4.2 验证邮箱

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>验证邮箱:微信公众号:AlbertYang</title>
  6. </head>
  7. <body>
  8. 请您输入邮箱地址:<input type="text" value="" id="email" /> *<br />
  9. <script>
  10. //如果输入的是邮箱,那么背景颜色为绿色,否则为红色
  11. //获取文本框,注册失去焦点的事件
  12. document.getElementById("email").onblur = function() {
  13. //判断这个文本框中输入的是不是邮箱
  14. let reg = /^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_-]+([.][a-zA-Z]+){1,2}$/;
  15. if (reg.test(this.value)) {
  16. this.style.backgroundColor = "green";
  17. } else {
  18. this.style.backgroundColor = "red";
  19. }
  20. };
  21. </script>
  22. </body>
  23. </html>

3.4.3 验证中文名字

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>验证中文名字:微信公众号AlbertYang</title>
  6. </head>
  7. <body>
  8. 请输入您的名字:<input type="text" value="" id="userName" />*<br />
  9. <script>
  10. // 是中文名字,则绿色,否则红色
  11. document.getElementById("userName").onblur = function() {
  12. var reg = /^[\u4e00-\u9fa5]{2,6}$/;
  13. if (reg.test(this.value)) {
  14. this.style.backgroundColor = "green";
  15. } else {
  16. this.style.backgroundColor = "pink";
  17. }
  18. };
  19. </script>
  20. </body>
  21. </html>

3.5 正则表达式提取

  1. // 提取年龄var str = "张三18,李四36,王五60";
  2. var array = str.match(/\d+/g);
  3. console.log(array);
  4. // 提取email地址var str = "4645354@qq.com,fangfang@usa.cn 256469312@qq.com,28265432@qq.com";
  5. var array = str.match(/\w+@\w+\.\w+(\.\w+)?/g);
  6. console.log(array);
  7. // 分组提取
  8. // 提取日期中的年 2020-10-24var dateStr = '2020-10-24';
  9. // 正则表达式中的()作为分组来使用,获取分组匹配到的结果使用Regex.$1 $2 $3...
  10. var reg = /(\d{4})-\d{1,2}-\d{1,2}/;
  11. if (reg.test(dateStr)) {
  12. console.log(RegExp.$1);
  13. }
  14. // 提取邮件中的每一部分var reg = /(\w+)@(\w+)\.(\w+)(\.\w+)?/;
  15. var str = "932errewerrw@126.com";
  16. if (reg.test(str)) {
  17. console.log(RegExp.$1);
  18. console.log(RegExp.$2);
  19. console.log(RegExp.$3);
  20. }

3.6 正则表达式替换

  1. // 1.替换所有空白字符var str = " reeed asafdre56df 3rfereww rtere ";
  2. str = str.replace(/\s/g, "***");
  3. console.log(str);
  4. // 2.替换所有,或,var str = "abc,efg,123,abc,123,a";
  5. str = str.replace(/,|,/g, ":");
  6. console.log(str);

4 案例

4.1 表单验证案例

  1. <!DOCTYPE html><html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>表单验证:微信公众号AlbertYang</title>
  5. <style type="text/css">
  6. body {
  7. background: #ccc;
  8. }
  9. label {
  10. width: 40px;
  11. display: inline-block;
  12. }
  13. span {
  14. color: red;
  15. }
  16. .container {
  17. margin: 100px auto;
  18. width: 400px;
  19. padding: 50px;
  20. line-height: 40px;
  21. border: 1px solid #999;
  22. background: #efefef;
  23. }
  24. span {
  25. margin-left: 30px;
  26. font-size: 12px;
  27. }
  28. .wrong {
  29. color: red
  30. }
  31. .right {
  32. color: green;
  33. }
  34. .defau {
  35. width: 200px;
  36. height: 20px;
  37. }
  38. .de1 {
  39. background-position: 0 -20px;
  40. }
  41. </style>
  42. </head>
  43. <body>
  44. <div class="container" id="dv">
  45. <label for="qq">Q Q</label><input type="text" id="qq"><span></span><br />
  46. <label>手机</label><input type="text" id="phone"><span></span><br />
  47. <label>邮箱</label><input type="text" id="e-mail"><span></span><br />
  48. <label>座机</label><input type="text" id="telephone"><span></span><br />
  49. <label>姓名</label><input type="text" id="fullName"><span></span><br />
  50. </div>
  51. <script>
  52. // qq
  53. checkInput(document.getElementById("qq"), /^\d{5,11}$/);
  54. // 手机
  55. checkInput(document.getElementById("phone"), /^\d{11}$/);
  56. // 邮箱
  57. checkInput(document.getElementById("e-mail"), /^[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}$/);
  58. // 座机号码
  59. checkInput(document.getElementById("telephone"), /^\d{3,4}[-]\d{7,8}$/);
  60. // 中文名字
  61. checkInput(document.getElementById("fullName"), /^[\u4e00-\u9fa5]{2,6}$/);
  62. // 根据文本框和这个文本框相应的正则表达式,验证当前文本框中的值,与给出的正则表达式否匹配
  63. function checkInput(input, reg) {
  64. // 文本框失去焦点的事件
  65. input.onblur = function() {
  66. if (reg.test(this.value)) {
  67. this.nextElementSibling.innerText = "正确";
  68. this.nextElementSibling.style.color = "green";
  69. } else {
  70. this.nextElementSibling.innerText = "错误,请您重新输入";
  71. this.nextElementSibling.style.color = "red";
  72. }
  73. };
  74. }
  75. </script>
  76. </body></html>

4.2 过滤敏感词汇案例

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>过滤敏感词汇:公众号AlbertYang</title>
  6. </head>
  7. <body>
  8. <textarea name="" id="message"></textarea> <button>提交</button>
  9. <div></div>
  10. <script>
  11. var text = document.querySelector('textarea');
  12. var btn = document.querySelector('button');
  13. var div = document.querySelector('div');
  14. btn.onclick = function() {
  15. div.innerHTML = text.value.replace(/激情|gay|AV/g, '**');
  16. }
  17. </script>
  18. </body>