[关闭]
@fantaghiro 2014-12-29T07:32:22.000000Z 字数 11667 阅读 1482

妙味课堂 - 正则表达式

学习笔记 js 前端 妙味课堂


复习字符串操作

找出字符串中的所有数字

用传统字符串操作完成

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>复习字符串的操作</title>
  6. <script>
  7. //alert('a'<'b'); //true 字符串比较按照字符串的编码进行比较
  8. /* 判断一个字符串是否是数字类型的字符串
  9. var str = '5';
  10. if(str <= '9' && str >= '0'){ //如果str满足条件的话,那么它必然是一个数字类型的字符串
  11. alert('是数字类型的字符串');
  12. } else {
  13. alert('不是数字类型的字符串');
  14. }
  15. */
  16. //找出字符串中的所有数字
  17. var str = 'afg7agklha6shh5ngj76dgha4ssfhjt879';
  18. function findNum(){
  19. var arr = [];
  20. var tmp = '';
  21. for(var i=0; i<str.length; i++){
  22. if(str.charAt(i) <= '9' && str.charAt(i) >= '0'){
  23. //arr.push(str.charAt(i));
  24. tmp += str.charAt(i);
  25. } else {
  26. if(tmp){
  27. arr.push(tmp);
  28. tmp = '';
  29. }
  30. }
  31. }
  32. //针对最后的一个数字,添加进来
  33. if(tmp){
  34. arr.push(tmp);
  35. tmp = '';
  36. }
  37. return arr;
  38. }
  39. alert(findNum(str));
  40. </script>
  41. </head>
  42. <body>
  43. </body>
  44. </html>

用正则表达式完成

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>复习字符串的操作</title>
  6. <script>
  7. var str = 'afg7agklha6shh5ngj76dgha4ssfhjt879';
  8. function findNum(str){
  9. return str.match(/\d+/g);
  10. }
  11. alert(findNum(str));
  12. </script>
  13. </head>
  14. <body>
  15. </body>
  16. </html>

什么是正则表达式

正则的写法

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script>
  7. var arr = [];
  8. var arr = new Array();
  9. var obj = {};
  10. var obj = new Object();
  11. //正则:
  12. var re = /a/; //如果正则里面为空,浏览器会认为它是注释,因此正则简写的方式一定不能为空。两个引号之间的东西并不是字符串,而是正则独有的写法,斜线里面的东西不要用引号括起来
  13. var re = new RegExp('a');
  14. </script>
  15. </head>
  16. <body>
  17. </body>
  18. </html>

正则表达式常用方法

test

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则的方法.test</title>
  6. <script>
  7. // test : 正则去匹配字符串,如果匹配成功就返回真;如果匹配失败,就返回假
  8. // test的写法 : 正则.test(字符串)
  9. /*
  10. var str = 'abcdef';
  11. var re1 = /b/;
  12. var re2 = /w/;
  13. var re3 = /bc/;
  14. var re4 = /bd/;
  15. alert(re1.test(str)); //true
  16. alert(re2.test(str)); //false
  17. alert(re3.test(str)); //true
  18. alert(re4.test(str)); //false
  19. */
  20. /*
  21. //转义字符:
  22. alert('anb');
  23. alert('a\nb'); //这里的n前面加了反斜线,代表换行
  24. n \n 换行
  25. r \r 制表
  26. t \t 回车
  27. */
  28. /*
  29. \s : 空格
  30. \S : 非空格
  31. \d : 数字
  32. \D : 非数字
  33. \w : 字符 (字母、数字、下划线 _)
  34. \W : 非字符
  35. */
  36. // var str = '473t9487306';
  37. // var re = /t/;
  38. // if(re.test(str)){
  39. // alert('不全是数字');
  40. // } else {
  41. // alert('全是数字');
  42. // }
  43. var str = '473t9487306';
  44. var re = /\D/;
  45. if(re.test(str)){
  46. alert('不全是数字');
  47. } else {
  48. alert('全是数字');
  49. }
  50. </script>
  51. </head>
  52. <body>
  53. </body>
  54. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则的方法.search</title>
  6. <script>
  7. // search : 正则去匹配字符串,如果匹配成功,就返回匹配成功的位置;如果匹配失败,就返回-1。特别像indexOf这个字符串方法
  8. // search的写法 : 字符串.search(正则)
  9. // 正则中的默认:是区分大小写的
  10. // 如果不区分大小写的话,在正则的最后加标识 i (不区分大小写)
  11. var str = 'abcdef';
  12. var re1 = /bcd/;
  13. var re2 = /w/;
  14. var re3 = /B/;
  15. var re4 = /B/i;
  16. var re5 = new RegExp('B', 'i'); //这一行的写法与上面一行的写法,意义完全一样
  17. alert(str.search(re1)); //弹出1 弹的是匹配的首字母的位置
  18. alert(str.search(re2)); //弹出-1
  19. alert(str.search(re3)); //弹出-1 //正则默认下是区分大小写的
  20. alert(str.search(re4)); //弹出1
  21. alert(str.search(re5)); //弹出1
  22. </script>
  23. </head>
  24. <body>
  25. </body>
  26. </html>

match

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则的方法.match</title>
  6. <script>
  7. // match : 正则去匹配字符串,如果匹配成功,就返回匹配成功的数组;如果匹配失败,就返回null
  8. // match的写法 : 字符串.match(正则)
  9. //正则默认:正则匹配成功就会结束,不会继续匹配
  10. //如果想全部查找,就要加标识 g(全局匹配)
  11. //量词:匹配不确定的位置
  12. // + : 至少出现一次
  13. var str = 'sdogh3woiehgxfkjb789paf34dj4pgdfhgdorg43';
  14. var re1 = /\d/;
  15. var re2 = /\d/g;
  16. var re3 = /\d\d/g;
  17. var re4 = /\d\d\d/g;
  18. var re5 = /\d\d\d\d/g;
  19. var re6 = /\d+/g; //这里说明前面的反斜杠d至少出现一次,多则不限
  20. alert(str.match(re1)); //[3] 返回的是找到的第一个数字
  21. alert(str.match(re2)); // [3, 7, 8, 9, 3, 4, 4, 4, 3]
  22. alert(str.match(re3)); //[78, 34, 43]
  23. alert(str.match(re4)); //[789]
  24. alert(str.match(re5)); // null
  25. alert(str.match(re6)); //[3, 789, 34, 4, 43]
  26. </script>
  27. </head>
  28. <body>
  29. </body>
  30. </html>

replace

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则的方法.replace</title>
  6. <script>
  7. // replace : 正则去匹配字符串,匹配成功的字符去替换成新的字符串
  8. // replace的写法 : 字符串.replace(正则, 新的字符串)
  9. var str1 = 'aaa';
  10. var str2 = 'aaa';
  11. var str3 = 'aaa';
  12. var re1 = /a/;
  13. var re2 = /a/g;
  14. var re3 = /a+/g;
  15. str1 = str1.replace(re1, 'b');
  16. alert(str1); //'baa'
  17. str2 = str2.replace(re2, 'b');
  18. alert(str2); //'bbb'
  19. str3 = str3.replace(re3, 'b');
  20. alert(str3); //'b'
  21. </script>
  22. </head>
  23. <body>
  24. </body>
  25. </html>

敏感词过滤实例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>用replace方法实现敏感词过滤</title>
  6. <script>
  7. //敏感词包括“菲称”、“中国船”、“监视之下”
  8. // | : “或”的意思
  9. // replace : 第二个参数;可以是字符串,也可以是一个回调函数
  10. window.onload = function(){
  11. var aT = document.getElementsByTagName('textarea');
  12. var oInput = document.getElementById('input1');
  13. var re = /菲称|中国船|监视之下/g;
  14. oInput.onclick = function(){
  15. //aT[1].value = aT[0].value.replace(re, '*');
  16. // aT[1].value = aT[0].value.replace(re, function(){
  17. // return '*';
  18. // }); //这个代码段与上面那一行代码的意义是一模一样的
  19. aT[1].value = aT[0].value.replace(re, function(str){ //函数的第一个参数:就是匹配成功的字符
  20. //alert(str);
  21. var result = '';
  22. for(var i=0; i<str.length; i++){
  23. result += '*';
  24. }
  25. return result;
  26. });
  27. }
  28. }
  29. </script>
  30. </head>
  31. <body>
  32. 替换前<br />
  33. <textarea>菲称仁爱礁附近17艘中国船均在菲军监视之下</textarea><br>
  34. 替换后<br>
  35. <textarea></textarea>
  36. <input type="button" value="确定" id="input1">
  37. </body>
  38. </html>

匹配子项

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>匹配子项</title>
  6. <script>
  7. // 匹配子项 : 小括号 () (还有另外一个意思:分组操作)
  8. // (1+1)*2 和 1+1*2
  9. //把正则的整体叫做(母亲)
  10. // 然后把左边第一个小括号里面的正则,叫做这个第一个子项(母亲的第一个孩子)
  11. // 第二个小括号就是第二个孩子
  12. var str1 = '2013-6-7';
  13. var str2 = '2013-6-7';
  14. var str3 = '2013-6-7';
  15. var str4 = '2013-6-7';
  16. var str5 = '2013-6-7';
  17. var re1 = /\d+-/g;
  18. var re2 = /\d-+/g; //一个数字加至少一个横杠
  19. var re3 = /(\d-)+/g;
  20. var re4 = /(\d+)(-)/g;
  21. var re5 = /(\d+)(-)/g;
  22. // str1.replace(re1, function($0){
  23. // alert($0); //2013- 和 6-
  24. // })
  25. // str2.replace(re2, function($0){
  26. // alert($0); //3- 和 6-
  27. // })
  28. // str3.replace(re3, function($0){
  29. // alert($0); //3-6-
  30. // })
  31. /*
  32. str4.replace(re4, function($0, $1, $2){
  33. // 第一个参数 : $0 (母亲)
  34. // 第二个参数 : $1 (第一个孩子)
  35. // 第三个参数 : $2 (第二个孩子)
  36. // 以此类推
  37. alert($0); //2013- , 6-
  38. alert($1); //2013 , 6
  39. alert($2); // - , -
  40. //运行一次弹出:2013-, 2013, -, 6-, 6, -
  41. })
  42. */
  43. str5 = str5.replace(re5, function($0, $1, $2){
  44. // return $0.substring(0, $0.length - 1) + '.';
  45. return $1 + '.'; //2013.6.7
  46. })
  47. alert(str5); //2013.6.7
  48. </script>
  49. </head>
  50. <body>
  51. </body>
  52. </html>

match方法中的匹配子项

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>匹配子项</title>
  6. <script>
  7. var str1 = 'abc';
  8. var re1 = /abc/;
  9. var str2 = 'abc';
  10. var re2 = /(a)(b)(c)/;
  11. var str3 = 'abc';
  12. var re3 = /(a)(b)(c)/g;
  13. alert(str1.match(re1)); //[abc]
  14. alert(str2.match(re2)); //[abc, a, b, c](当match不加g的时候才可以获取到匹配子项的集合)
  15. alert(str3.match(re3)); //[abc] //这里因为re里面加个g,就不会获得上面那一句的结果了
  16. </script>
  17. </head>
  18. <body>
  19. </body>
  20. </html>

正则表达式字符类

任意字符

范围

排除

字符类

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>正则表达式中的字符类</title>
  6. <script>
  7. //字符类 : 一组相似的元素或字符
  8. //字符类 : 用中括号表示,中括号的整体代表一个字符
  9. var str1 = 'abc';
  10. var re1 = /a[bde]c/;
  11. alert(re1.test(str1)); //true
  12. var str2 = 'aec';
  13. var re2 = /a[bde]c/;
  14. alert(re2.test(str2)); //true
  15. var str3 = 'abdc';
  16. var re3 = /a[bde]c/;
  17. alert(re3.test(str3)); //false
  18. //排除 : ^ 如果^写在[]里面的话,就代表排除的意思
  19. var str4 = 'abc';
  20. var re4 = /a[^bde]c/;
  21. alert(re4.test(str4)); //false
  22. var str5 = 'awc';
  23. var re5 = /a[^bde]c/;
  24. alert(re5.test(str5)); //true
  25. //范围 : - 如果-写在[]里面的话,就代表范围,范围一定是从小到大的
  26. var str6 = 'abc';
  27. var re6 = /a[e-j]c/;
  28. alert(re6.test(str6)); //false
  29. var str7 = 'afc';
  30. var re7 = /a[e-j]c/;
  31. alert(re7.test(str7)); //true
  32. var str8 = 'a3c';
  33. var re8 = /a[a-z0-9A-Z]c/;
  34. alert(re8.test(str8)); //true
  35. var str9 = 'a3eJ86Xc';
  36. var re9 = /a[a-z0-9A-Z]+c/; //在中括号外面添加了+,代表可以多位
  37. alert(re9.test(str9)); //true
  38. </script>
  39. </head>
  40. <body>
  41. </body>
  42. </html>

组合

实例:偷小说

字符类实例,过滤标签

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>字符类:过滤标签</title>
  6. <script>
  7. window.onload = function(){
  8. var aT = document.getElementsByTagName('textarea');
  9. var oInput = document.getElementById('input1');
  10. oInput.onclick = function(){
  11. //var re = /<\w+>/g; 这个正则不认反斜杠和引号等特殊字符
  12. var re = /<[^>]+>/g;
  13. aT[1].value = aT[0].value.replace(re, '');
  14. }
  15. }
  16. </script>
  17. </head>
  18. <body>
  19. 替换前<br />
  20. <textarea><h3 class="box">标题</h3>aaaaaa</textarea><br>
  21. 替换后<br>
  22. <textarea></textarea>
  23. <input type="button" value="确定" id="input1">
  24. </body>
  25. </html>

转义字符

转义字符

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script>
  7. // 转义字符
  8. // . : 任意字符
  9. // \. : 真正的点
  10. var str1 = 'a你c';
  11. var re1 = /a.c/;
  12. alert(re1.test(str1)); //true
  13. var str2 = 'a你c';
  14. var re2 = /a\.c/;
  15. alert(re2.test(str2)); //false
  16. // \b : 独立的部分(起始、结束、空格)
  17. // \B : 非独立的部分
  18. var str3 = 'onetwo';
  19. var re3 = /one/;
  20. alert(re3.test(str3)); //true;
  21. var str4 = 'onetwo';
  22. var re4 = /\bone/; //代表字母o前面必须是独立部分,o前面是起始位置
  23. alert(re4.test(str4)); //true;
  24. var str5 = 'onetwo';
  25. var re5 = /one\b/; //e后面是个t,不是个独立部分
  26. alert(re5.test(str5)); //false;
  27. var str6 = 'one two';
  28. var re6 = /one\b/; //e后面是个空格,是独立部分
  29. alert(re6.test(str6)); //true;
  30. var str7 = 'onetwo';
  31. var re7 = /\bone\b/; //前面满足后面不满足,整体也就不满足
  32. alert(re7.test(str7)); //false;
  33. </script>
  34. </head>
  35. <body>
  36. </body>
  37. </html>

获取class元素

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>获取class方法</title>
  6. <script>
  7. //要找到class为box1的元素,也就是第一个和最后一个li匹配
  8. window.onload = function(){
  9. var aLi = getByClass(document, 'box1');
  10. for(var i=0; i<aLi.length; i++){
  11. aLi[i].style.background = 'red';
  12. }
  13. /* 老方法,有问题,只能匹配第一个li
  14. function getByClass(oParent, sClass){
  15. var arr = [];
  16. var aEle = oParent.getElementsByTagName('*');
  17. for(var i=0; i<aEle.length; i++){
  18. if(aEle[i].className == sClass){
  19. arr.push(aEle[i]);
  20. }
  21. }
  22. return arr;
  23. }
  24. */
  25. //改进版
  26. function getByClass(oParent, sClass){
  27. var arr = [];
  28. var aEle = oParent.getElementsByTagName('*');
  29. //当正则需要传参的时候,一定要用全称的写法
  30. // var re = new RegExp(sClass); //用这个正则,1、3、5都能找到
  31. var re = new RegExp('\\b'+sClass+'\\b'); //注意,这里要写两个反斜杠才能最终输出反斜杠,只写一个反斜杠是输出不出来的
  32. for(var i=0; i<aEle.length; i++){
  33. if(re.test(aEle[i].className)){
  34. arr.push(aEle[i]);
  35. }
  36. }
  37. return arr;
  38. }
  39. }
  40. </script>
  41. </head>
  42. <body>
  43. <ul>
  44. <li class="box1">111</li>
  45. <li>111</li>
  46. <li class="box1box2">111</li>
  47. <li>111</li>
  48. <li class="box1 box2">111</li>
  49. </ul>
  50. </body>
  51. </html>

重复子项

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>重复子项</title>
  6. <script>
  7. /////////////////////
  8. // \1 : 重复的第一个子项
  9. // \2 : 重复的第二个子项
  10. // 以此类推
  11. /////////////////////
  12. var str1 = 'abca';
  13. var re1 = /(a)(b)(c)\1/;
  14. alert(re1.test(str1)); //true
  15. var str2 = 'abca';
  16. var re2 = /(a)(b)(c)\2/;
  17. alert(re2.test(str2)); //false
  18. var re3 = /\w\w/; //ab可以匹配成功
  19. var re4 = /\w\1/; //c9无法匹配成功,只能cc或99这种才能匹配成功
  20. </script>
  21. </head>
  22. <body>
  23. </body>
  24. </html>

找重复项最多的字符和个数

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>找重复项最多的字符和个数</title>
  6. <script>
  7. var str = 'algkjaljgdsskglakjldssslkgjlslsjgkjsls';
  8. var arr = str.split('');
  9. str = arr.sort().join('');
  10. // alert(str);
  11. var value = '';
  12. var index = 0;
  13. var re = /(\w)\1+/g;
  14. str.replace(re, function($0, $1){
  15. //alert($0);
  16. if(index < $0.length){
  17. index = $0.length;
  18. value = $1;
  19. }
  20. });
  21. alert('最多的字符:' + value + ',重复的次数:' + index);
  22. </script>
  23. </head>
  24. <body>
  25. </body>
  26. </html>

量词

什么是量词

量词

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>量词</title>
  6. <script>
  7. // 量词 : {}
  8. // {4, 7} : 最少出现4次,最多出现7次
  9. // {4, } : 最少出现4次
  10. // {4} : 正好出现4次
  11. // + : {1,} 至少出现1次
  12. // ? : {0, 1} 出现0次或1次
  13. // * : {0, } 至少出现0次
  14. var str1 = 'ab';
  15. var re1 = /ab+/;
  16. alert(re1.test(str1)); //true
  17. var str2 = 'ac';
  18. var re2 = /ab+/;
  19. alert(re2.test(str2)); //false
  20. var str3 = 'ac';
  21. var re3 = /ab*/;
  22. alert(re3.test(str3)); //true
  23. </script>
  24. </head>
  25. <body>
  26. </body>
  27. </html>

查找QQ号

常用量词

正则收尾

判断是不是QQ号

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>查找QQ号</title>
  6. <script>
  7. // ^ : 放在中括号里面代表排除
  8. // ^ : 放到正则的最开始位置,就代表起始的意思
  9. // $ : 放在正则的最后位置,就代表结束的意思
  10. window.onload = function(){
  11. var aInput = document.getElementsByTagName('input');
  12. var re = /^[1-9]\d{4,11}$/; //这里的规则是首字母不为零,总共有5-7位数字;起始位置必须是一个1到9的数字,结束位置必须是一个4到11的数字
  13. aInput[1].onclick = function(){
  14. if(re.test(aInput[0].value)){
  15. alert('是QQ号');
  16. } else {
  17. alert('不是QQ号');
  18. }
  19. }
  20. }
  21. </script>
  22. </head>
  23. <body>
  24. <input type="text"><input type="button" value="确定">
  25. </body>
  26. </html>

去掉前后空格

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>去掉前后空格</title>
  6. <script>
  7. var str = ' hello ';
  8. alert('(' + trim(str) + ')');
  9. function trim(str){
  10. var re = /^\s+|\s+$/g; // \s代表空格,在开始的时候空格出现至少一次或者在结尾处空格至少出现一次
  11. return str.replace(re, '');
  12. }
  13. </script>
  14. </head>
  15. <body>
  16. </body>
  17. </html>

常用正则例子

高级表单校验

正则与面向对象

  1. var re = {
  2. qq: /[1-9][0-9]{4,9}/,
  3. email: /^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/,
  4. number: /\d+/
  5. }
  6. //使用时直接调用如:re.email

本课知识点

本课练习

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注