一、正则表达式

介绍

  • 作用:正则表达式( Regular Expression )是用于匹配字符串中字符组合的模式
  • 是什么:正则表达式也是对象。
  • 场景:正则表通常被用来检索、替换那些符合某个模式(规则)的文本

    1. 验证:例如表单,用户名表单只能输入英文字母、数字或者下划线, 昵称输入框中可以输入
      中文(匹配)。
    2. 过滤:正则表达式还常用于过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想
      要的特定部分(提取)等 。
  • 要求:

    • 灵活性、逻辑性和功能性非常的强。可以迅速地用极简单的方式达到字符串的复杂控制
    • 对于刚接触的人来说,比较晦涩难懂。/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+ ([-.]\w+)*$/
    • 实际开发,一般都是直接复制写好的正则表达式. 但是要求会使用正则表达式并且根据实际情
      况修改正则表达式. 比如用户名: /^[a-z0-9_-]{3,16}$/

语法

  • 对象:{ } [ ] 函数 DOM BOM 用户行为event 正则

  • 方式一:通过调用RegExp对象的构造函数创建

    1. //2.了解 构造函数 了解
    2. var regexp = new RegExp(/123/);
    3. console.log(regexp);
  • 方式二:利用字面量创建 正则表达式; 正则对象和字母类字符串没有任何关系!
    var rg = /规则内容/; //字面量 /写规则/

test方法

  • test() 正则对象的方法,用于检测字符串是否符合该规则,该对象会返回 true 或 false,其参数是
    测试字符串。

    1. //如何进行检查匹配
    2. let reg = /abc/;
    3. // 对象.test();
    4. // 参数:被检测的文本内容 字符串 数字
    5. // 结果:true / false
    6. let res1 = reg.test("abd")
    7. console.log(res1)
    8. let res2 = reg.test("abcdefg")
    9. console.log(res2)
    10. //1.正则,对象 2.reg.test(); 3./abc/ 只需要包含就算满足要求

特殊字符

  • 一个正则表达式可以由简单的字符构成,比如 /abc/,也可以是简单和特殊字符的组合,比如
    /ab*c/ 。其中特殊字符也被称为元字符,在正则表达式中是具有特殊意义的专用符号,如 ^ 、$
    、+ 等
  • 参考:

    • 特殊字符非常多,可以参考: MDN
    • jQuery 手册:正则表达式部分 正则测试工具

边界符

  • 正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符 | 边界符 | 说明 | | :—-: | :—-: | | ^ | 表示匹配行首的文本(以谁开始) | | $ | 表示匹配行尾的文本(以谁结束) |
  • 如果 ^和 $ 在一起,表示必须是精确匹配

  • 注意:正则表达式里面不需要加引号 不管是数字型还是字符串型

    1. //基本语法:
    2. // ^:位置 /^规则/ 被检测文本必须要按照正则要求这样开头才可以
    3. // 必须:必须开头,必须是我要求检测,缺一不可
    4. let reg1 = /^abc/
    5. let res1 = reg1.test("labe")
    6. console.log(res1)
    7. // ^:位置 /$规则/ 被检测文本必须要按照正则要求这样结尾才可以
    8. // 必须:必须结尾,必须是我要求检测,缺一不可
    9. let reg = /abc$/
    10. let res = reg.test("sddaadadd")
    11. console.log(res);
    12. // ^ $:位置,从 ^,到$结束
    13. // 必须:必须从头到尾都是规则要求的内容;
    14. let reg = /^abc$/
    15. let res = reg.test("abc")
    16. console.log(res);

( | )

  • 从()内选出一组就可以

    1. var rg = /^(abc|bbb|ccc)$/;
    2. rg.test("bbb") // true;

[ ]

  • 表示有一系列字符可供选择,只要匹配其中一个就可以了
  1. var rg = /[abc]/; // 只要包含有a 或者 包含有b 或者包含有c 都返回为true
  2. console.log(rg.test('andy'));//true
  3. console.log(rg.test('baby'));//true
  4. console.log(rg.test('color'));//true
  5. console.log(rg.test('red'));//false
  6. var rg1 = /^[abc]$/; // 三选一 只有是a 或者是 b 或者是c 这三个字母才返回 true
  7. console.log(rg1.test('aa')); //false
  8. console.log(rg1.test('a'));//true
  9. console.log(rg1.test('b'));//true
  10. console.log(rg1.test('c'));//true
  11. console.log(rg1.test('abc'));//false
  12. //------------------------------------------------------------------
  13. var reg = /^[a-z]$/ //26个英文字母任何一个字母返回 true - 表示的是a 到z 的范围
  14. console.log(reg.test('a'));//true
  15. console.log(reg.test('z'));//true
  16. console.log(reg.test('A'));//false
  17. --------------------------------------------------------------------------------
  18. //字符组合
  19. var reg1 = /^[a-zA-Z0-9]$/; // 26个英文字母(大写和小写都可以)任何一个字母返回 true
  20. --------------------------------------------------------------------------------
  21. //取反 方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false 。
  22. var reg2 = /^[^a-zA-Z0-9]$/;
  23. console.log(reg2.test('a'));//false
  24. console.log(reg2.test('B'));//false
  25. console.log(reg2.test(8));//false
  26. console.log(reg2.test('!'));//true
  27. //组合使用
  28. let reg6 = /^[^A-Za-z0-9|A-Za-z0-9]%/
  29. let reg5 = /^[^A-Za-z0-9]$/
  30. // [^规则:]:取多立面,只要不是中括号里面的一个 字符串就满足要求
  31. let res5 = reg5.test(" ")
  32. console.log(res5);

量词符号

量词 说明
* 重复0次或更多次
+ 重复1次或更多
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
  1. //[ ] () ;个数默认事1
  2. // 量词符: 按照设置数量匹配
  3. // *:允许规则重复0次或者多次;次数>=0
  4. // 位置:放在规则后面
  5. let reg1 = /^a*$/
  6. console.log(reg1.test("abc")); //false
  7. let reg2 = /^[abc]*$/
  8. console.log(reg2.test("abcabc")); //true
  9. let reg3 = /^(aa|bb|cc|abc)*$/
  10. console.log(reg3.test("abcaaabc")); //true
  11. //+:允许满足规则的文本,重复1次或者多次;次数+1
  12. let reg1 = /^a+$/
  13. console.log(reg1.test("")); //false
  14. let reg2 = /^a+b$/
  15. console.log(reg2.test("ab")); //true
  16. let reg3 = /^[a-z]+[0-9]*|[A-Z]$/
  17. // console.log(reg3.test("a - z + 0 - 9 | A - Z")); //true
  18. console.log(reg3.test("sa93AZ1aa")) //true
  19. //? 允许满足规则的文本 重复0次或者1次;0或1选择一次
  20. let reg1 = /^a?$/
  21. console.log(reg1.test("aa")); //false
  22. let reg2 = /^[a-z]?$/
  23. console.log(reg2.test("aa")); //false
  24. let reg3 = /^[a-z]?[A-Z]?[0-9]$/
  25. console.log(reg3.test("aA")); //false
  26. //{} 允许满足规则的文本,具体控制重复次数 6-9次
  27. // {n,m} n-m次
  28. // {n} 固定此时n次
  29. // {n,} 至少重复n次

案例:用户名表单验证功能需求:

  1. <input type="text" class="uname" pattern="请输入用户名">
  2. <button>注册</button>
  3. <p></p>
  4. <script>
  5. // 用户名表单验证功能需求:
  6. // 需求: 用户注册用户名,有要求(字母、数字、下划线_、-)6 - 9位 [a-zA-Z0-9_]
  7. // 点击注册的时候。如果满足要求。显示注册成功,不满足要求,提醒弹窗,且输入框置空:
  8. let ipt = document.querySelector(".uname")
  9. let btn = document.querySelector("button")
  10. let p = document.querySelector("p")
  11. btn.addEventListener("click", function () {
  12. let reg = /^[a-zA-Z0-9_-]{6,16}$/
  13. //升级 开头必须是大写
  14. // let reg = /^[a-zA-Z][a-zA-Z0-9_-]{5,8}$/
  15. // let res = reg.test(ipt.value) 声明
  16. if (reg.test(ipt.value) == true) {
  17. alert("注册成功")
  18. p.innerHTML = "用户格式输入正确"
  19. console.log()
  20. } else {
  21. alert("注册不成功,不满足要求")
  22. ipt.value = ""
  23. p.innerHTML = "用户格式输入错误"
  24. //字体颜色
  25. p.style.color = "red"
  26. }
  27. })
  28. </script>

预定义

  • 预定义类指的是某些常见模式的简写方式
    1. // 只能记住常用,预先定义简单写法
    2. //只能记住常用:预先定义简单写法,/ld=[0-9];
    3. //D==除[0-9]范围外所有11
    4. // \w == [A-Za-z0-9_]
    5. // \W == [ ^A-Za-z-9_]
    6. // \s ==[ \tlrinivif]
    7. // \S ==[ ^\t\r\n\v\f ]
预定类 说明
\d 匹配0-9之间的任一数字,相当于[0-9][^O-9]
\D 匹配所有0-9以外的字符,相当于[ ^0-9 ]
\w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]
\W 除所有字母、数字和下划线以外的字符,相当于[ ^A-Za-z-9_]
\s 匹配空格(包括换行符、制表符、空格符等),相等于[ \tlrinivif]
\S 匹配非空格的字符,相当于[ ^\t\r\n\v\f ]
  • 案例:验证座机号码

    1. var reg = /^(\d{3}-\d{8}|\d{4}-\d{7})$/;
    2. //座机:区号(3-4)-(7,9)
    3. let reg = /^d{3,4}-\d{7,9}$/
    4. console.log(reg.test("0000-1234567")); //false

案例:用户注册列表

    1. <style>
    2. .box {
    3. margin: 50px auto;
    4. width: 600px;
    5. box-shadow: 0 0 10px #000;
    6. }
    7. .item {
    8. padding-top: 20px;
    9. height: 30px;
    10. padding-left: 40px;
    11. }
    12. button {
    13. width: 100px;
    14. height: 40px;
    15. margin-left: 200px;
    16. margin-bottom: 10px;
    17. background-color: orange;
    18. border-radius: 10px;
    19. }
    20. </style>
    21. <body>
    22. <div class="box">
    23. <div class="item">
    24. 昵称:<input type="text" id="name">
    25. </div>
    26. <div class="item">
    27. 密码:<input type="password" id="pwd">
    28. </div>
    29. <div class="item">
    30. 再次密码:<input type="password" id="repwd">
    31. </div>
    32. <div class="item">
    33. 手机:<input type="text" id="phone">
    34. </div>
    35. <button>注册</button>
    36. </div>
    37. <script>
    38. // 需求:
    39. // 1. 昵称 2-8非空字符
    40. // 2. 密码:字母数字组合,开头必须位字母大写, 6-9位
    41. // 3. 密码和再次密码 一样
    42. // 4. 手机号符号要求
    43. // 5. 点击注册, 不满足要求的,弹窗提醒,把该项置空!
    44. // 所有信息都满足要求,把收集到 {key:val} 输出;
    45. // 昵称: username 密码:password 手机:phone
    46. // {username:"xxxxx",password:1212121,phone:15211113333}
    47. // 步骤:
    48. // 1.btn,添加事件
    49. let btn = document.querySelector("button");
    50. let name = document.querySelector("#name");
    51. let pwd = document.querySelector("#pwd");
    52. let repwd = document.querySelector("#repwd");
    53. let phone = document.querySelector("#phone");
    54. btn.addEventListener("click", function () {
    55. // 2 昵称
    56. // 2.1 用户输入数据
    57. let nameVal = name.value;
    58. // 2.2 正则
    59. let nameReg = /^\S{2,8}$/;
    60. // 2.3 验证
    61. let nameRes = nameReg.test(nameVal);
    62. // 2.4 判断
    63. if (nameRes == false) {
    64. alert("昵称不满足要求");
    65. name.value = "";
    66. return;
    67. }
    68. // 3 密码
    69. // 3.1 用户输入数据
    70. let pwdVal = pwd.value;
    71. // 3.2 正则
    72. let pwdReg = /^[A-Z][a-zA-Z0-9]{5,8}$/;
    73. // 3.3 验证
    74. let pwdRes = pwdReg.test(pwdVal);
    75. // 3.4 判断
    76. if (pwdRes == false) {
    77. alert("密码不满足要求");
    78. pwd.value = "";
    79. return;
    80. }
    81. // 4 再次密码:
    82. // 4.1 用户输入数据
    83. let repVal = repwd.value;
    84. if (pwdVal != repVal) {
    85. alert("两次密码输入不一致");
    86. repwd.value = "";
    87. return;
    88. }
    89. // 5.手机
    90. // 5.1 用户输入数据
    91. let phoneVal = phone.value;
    92. // 5.2 正则
    93. let phoneReg = /^1[356789]\d{9}$/;
    94. // 5.3 验证
    95. let phoneRes = phoneReg.test(phoneVal);
    96. // 5.4 判断
    97. if (phoneRes == false) {
    98. alert("手机号不满足要求");
    99. phone.value = "";
    100. return;
    101. }
    102. // 执行这
    103. let obj = {
    104. username: nameVal,
    105. password: pwdVal,
    106. phone: phoneVal
    107. }
    108. alert("注册成功")
    109. console.log(obj);
    110. })

字符串.replace

  • 字符串的方法:replace() 方法可以实现替换字符串操作,用来替换的参数可以是一个字符串或是
    一个正则表达式。
  1. var str = 'andy和red';
  2. var newStr = str.replace('andy', 'baby');
  3. console.log(newStr)//baby和red
  4. // 等同于 此处的andy可以写在正则表达式内
  5. var newStr2 = str.replace(/andy/, 'baby');
  6. console.log(newStr2)//baby和red
  7. // 替换一个
  8. var str = 'abcabc'案例:过滤敏感词汇
  9. var nStr = str.replace(/a/,'哈哈')
  10. console.log(nStr) //哈哈bcabc
  11. // 全部替换 g
  12. var nStr = str.replace(/a/g,'哈哈')
  13. console.log(nStr) //哈哈bc哈哈bc
  14. // 忽略大小写i
  15. var str = 'AAbcAba';
  16. var newStr = str.replace(/a/i,'哈哈')//"哈哈AbcAba"
  17. // 忽略大小写i且 全部替换
  18. var str = 'AAbcAba';
  19. var newStr = str.replace(/a/ig,'哈哈')//"哈哈AbcAba"

案例:过滤敏感词汇

  1. <textarea name="" id="message"></textarea>
  2. <button>提交</button>
  3. <div></div>
  4. <script>
  5. let text = document.querySelector('textarea');
  6. let btn = document.querySelector('button');
  7. let div = document.querySelector('div');
  8. btn.onclick = function() {
  9. div.innerHTML = text.value.replace(/(激情|gay)/g, '**');
  10. }
  11. </script>

二、表单事件

  • 表单元素:form表单内元素:

    • 输入框:

      • focus : 获得焦点
      • blur : 失去焦点
  • blur : 失去焦点
  • change : 表单控件值发生改变的时候
  • keydown: 键盘按下
  • keyup : 键盘弹起