JavaScript正则表达式 -- 笔记 - 图2项目:正则表达式测试工具

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>项目:正则表达式测试工具</title>
  6. <style type="text/css">
  7. #regexp{
  8. width: 650px;
  9. margin: 100px auto;
  10. font-size: 14px;
  11. }
  12. .title{
  13. color: #777;
  14. font-size: 24px;
  15. text-align: center;
  16. }
  17. .textbox{
  18. width: 638px;
  19. height: 150px;
  20. border: 1px solid #ccc;
  21. border-radius: 5px;
  22. padding: 5px;
  23. resize: none;
  24. }
  25. #matchingBtn{
  26. border-radius: 5px;
  27. color: white;
  28. background-color: #1E90FF;
  29. padding: 2px 5px;
  30. cursor: pointer;
  31. margin-left: 10px;
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <div id="regexp">
  37. <h1 class="title">正则表达式测试工具</h1>
  38. <textarea id="userText" class="textbox" placeholder="在此处输入待匹配的文字"></textarea>
  39. <p>
  40. 正则表达式:
  41. <input type="text" id="userRegExp" class="textfield" placeholder="在此处输入正则表达式">
  42. <label><input type="checkbox" name="userModifier" value="i">忽略大小写</label>
  43. <label><input type="checkbox" name="userModifier" value="g">全局匹配</label>
  44. <label><input type="checkbox" name="userModifier" value="m">多行匹配</label>
  45. <input type="button" id="matchingBtn" value="测试匹配">
  46. </p>
  47. 匹配结果:
  48. <textarea id="matchingResult" class="textbox" disabled="disabled"></textarea>
  49. </div>
  50. </body>
  51. <script type="text/javascript">
  52. // 此处定义全局变量
  53. var userText = document.getElementById('userText'),
  54. userRegExp = document.getElementById('userRegExp'),
  55. userModifier = document.getElementsByName('userModifier'),
  56. matchingBtn = document.getElementById('matchingBtn'),
  57. matchingResult = document.getElementById('matchingResult');
  58. var pattern,
  59. modifier = '';
  60. // 设置复选框点击操作
  61. for(var i=0;i<userModifier.length;i++){
  62. userModifier[i].onclick = function(){
  63. // 每次点击之前清空上次的干扰数据
  64. modifier='';
  65. for(var j=0;j<userModifier.length;j++){
  66. if (userModifier[j].checked) {
  67. // 用字符串拼接把value连起来
  68. modifier += userModifier[j].value;
  69. }
  70. }
  71. }
  72. }
  73. // 设置按钮点击事件
  74. matchingBtn.onclick = function(){
  75. // 判断文本框是否为空
  76. if (!userText.value) {
  77. alert('请输入待匹配文本!');
  78. userText.focus();
  79. return;
  80. }
  81. // 判断正则表达式是否为空
  82. if (!userRegExp.value) {
  83. alert('请输入正则表达式!');
  84. userRegExp.focus();
  85. return;
  86. }
  87. // 创建正则表达式
  88. pattern = new RegExp(userRegExp.value);
  89. matchingResult.value = pattern.exec(userText.value) || '没有匹配';
  90. }
  91. </script>
  92. </html>

review0608

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>正则表达式</title>
</head>
<body>

</body>
<script type="text/javascript">
    // 基础部分
    var str = 'i love js';
    var userInput = 'love';
    var pattern = new RegExp(userInput,'i');
    console.log(pattern);
    console.log(typeof pattern);
    console.log(pattern.exec(str));

    // 进阶部分
    var str = '//我是注释';
    var pattern = /\/\//;
    console.log(str);
    console.log(pattern.exec(str));

    var str = '\\\\';
    var pattern = /\\\\/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'nba';
    var pattern = /n/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = '1.html\n2.css\n3.js';
    var pattern = /\n/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = '    js';
    var pattern = /\t/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'a\nb';
    var pattern = /\x61\x0a\x62/;// ASCII表中0a表示换行
    console.log(str);
    console.log(pattern.exec(str));

    var str = '    js';
    var pattern = /\u0009/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'Alex哈';
    var pattern = /哈/;// \u4e00-\u9fa5 表示中文范围
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'JavaScript';
    var pattern = /JS/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'JavaScript';
    var pattern = /[^JS]/;// 表示除了JS以外得
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'JavaScript';
    var pattern = /[c-d]/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'Alex哈';
    var pattern = /[\u4e00-\u9fa5]/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'JavaScript';
    var pattern = /[a-zA-Z0-9]/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = '\n';
    var pattern = /./;
    console.log(str);
    console.log(pattern.exec(str));// null

    // /[a-zA-Z0-9_]/ == /\w/
    // /[^a-zA-Z0-9_]/ == /\W/
    // /[0-9]/ == /\d/
    // /[^0-9]/ == /\D/
    // \s 制表符

    // ?  {0,1}  最多出现一次
    // +  {1,}  至少出现一次
    // *  {0,}  可有可无

    var str = '肯德基豪华午餐:¥15.5!';
    var pattern = /\d+\.?\d*/;
    console.log(str);
    console.log(pattern.exec(str));

    // 贪婪模式
    var str = 'aaab';
    var pattern = /a+/;
    console.log(str);
    console.log(pattern.exec(str));

    // 非贪婪模式 ?
    var str = 'aaab';
    var pattern = /a+?/;
    console.log(str);
    console.log(pattern.exec(str));

    // 这种情况 不再满足非贪婪模式
    var str = 'aaab';
    var pattern = /a+?b/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = '<td>a</td><td>b</td>';
    var pattern = /<td>.*<\/td>/; // 贪婪
    console.log(str);
    console.log(pattern.exec(str));

    var str = '<td>a</td><td>b</td>';
    var pattern = /<td>.*?<\/td>/; // 非贪婪
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'html js';
    var pattern = /html|css|js/;
    console.log(str);
    console.log(pattern.exec(str));

    var str = 'c java c++ html';
    var pattern = /java|c\+\+|c|html/;
    console.log(str);
    console.log(pattern.exec(str));
</script>
</html>

review0609

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>正则表达式进阶2</title>
</head>
<body>

</body>
    <script type="text/javascript">
        // 正则表达式的选择,分组 引用 选择
        // /html|css|js/
        var str = 'css html js';
        var pattern=/html|css|js/;
        console.log(pattern.exec(str));

        var str = 'ab';
        var pattern=/a|ab/;
        console.log(pattern.exec(str));

        // 分组
        var str = 'abab';
        var pattern=/ab+/;
        console.log(pattern.exec(str));

        var str = 'abab';
        var pattern=/(ab)+/;
        console.log(pattern.exec(str));

        var str = 'abcd';
        var pattern=/(ab)c/;
        console.log(pattern.exec(str));//2个
        //第一个参数ab是一个分组  然后单独c  合起来   abc
        //第二个参数ab在括号中   所以也是一个单独的分组会被捕获

        var str = 'abcd';
        var pattern=/(?:ab)c/;//此时是非捕获状态
        console.log(pattern.exec(str));

        //平行括号
        var str = 'abcd';
        var pattern=/(ab)(c)/;
        console.log(pattern.exec(str));

        //嵌套括号
        var str = 'abcd';
        var pattern=/(a(b(c)))/;
        console.log(pattern.exec(str));

        //\1表示第一个分组  (ab)
        var str = 'ab cd ab';
        var pattern=/(ab) cd \1/;
        console.log(pattern.exec(str));

        var str = '<p><a>这是一段文字</a></p>';
        var pattern=/<([a-zA-Z]+)>(.*?)<\/\1>/;
        console.log(pattern.exec(str));

        //定位匹配;  ^  $
        var str = 'html js';
        var pattern=/^js/;
        console.log(pattern.exec(str));

        //尾匹配
        var str = 'html js css';
        var pattern=/js$/;
        console.log(pattern.exec(str));

        var str = '110119120';
        var pattern=/^\d+$/;
        console.log(pattern.exec(str));
        if (pattern.test(str)) {
            console.log('全是数字!');
        } else {
            console.log('不全是数字!');
        }

        var str = '11011912a0';
        var pattern=/\D/;
        console.log(pattern.exec(str));
        if (pattern.test(str)) {
            console.log('不全是数字!');
        } else {
            console.log('全是数字!');
        }

        // \b表示匹配的是单词的边界
        var str = 'js html';
        var pattern=/js\b/;
        console.log(pattern.exec(str));

        var str = '@@@js@@@';
        var pattern=/\bjs\b/;
        console.log(pattern.exec(str));

        //前瞻性匹配  ?=
        var str = 'javascript';
        var pattern=/java(?=script)/;
        console.log(pattern.exec(str));//java

        //负向前瞻性  ?!
        var str = 'javascript';
        var pattern=/java(?!script)/;
        console.log(pattern.exec(str));//null

        var str = 'javas';
        var pattern=/java(?!script)/;
        console.log(pattern.exec(str));//java

        // RegExp对象
        console.log(new RegExp('\\b'));
        // /\\/  --- >  匹配一个反斜杠
        console.log(new RegExp('\\\\'));

        //RegExp实例
        //不管是字面量方式还是构造函数方式
        //pattern都是正则的实例对象
        //实例对象上的方法叫做实例方法
        var pattern=/js/;
        var pattern=new RegExp('js');

        var str='jsjsjs';
        var pattern=/js/g;
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));

        var str = 'js js js';
        var pattern=/(j)s/g;
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));
        console.log(pattern.exec(str));

        var str='1.js 2.js 3.js';
        var pattern=/js/g;
        var total=0,
            match='',
            result;//接收exec匹配的数组
        while((result = pattern.exec(str))!=null){
            total++;
            match+='第'+total+'个匹配到的是:'+result[0]+',它的位置是:'+result.index+'\n';
        }
        match+='共找到:'+total+'处匹配\n';
        console.log(str);
        console.log(match);

        var str = 'js js js';
        var pattern=/js/g;
        console.log(pattern.test(str));
        console.log(pattern.test(str));
        console.log(pattern.test(str));
        console.log(pattern.test(str));
        console.log(pattern.test(str));

        var pattern=new RegExp('a\\nb');
        //toString是从Object继承过来的
        console.log(pattern.toString());
        //toLocaleString是从Object继承过来的
        console.log(pattern.toLocaleString());
        //valueof返回正则表达式本身
        console.log(pattern.valueOf()===pattern);

        // RegExp实例属性
        var str='js js js';
        var pattern = new RegExp('\\b','i');
        console.log(pattern.ignoreCase);
        console.log(pattern.global);
        console.log(pattern.multiline);
        //输出正则表达的字面量形式
        console.log(pattern.source);

        var str='js js js';
        var pattern = /js/g;
        console.log(pattern.lastIndex);
        pattern.test(str);
        console.log(pattern.lastIndex);
        pattern.test(str);
        console.log(pattern.lastIndex);
        pattern.test(str);
        console.log(pattern.lastIndex);
        pattern.test(str);
        console.log(pattern.lastIndex);
        pattern.test(str);
        console.log(pattern.lastIndex);
        pattern.test(str);

        //构造函数属性  --  有些浏览器实现不一样
        var str = 'js js js';
        var pattern=/(j)s/;
        pattern.exec(str);
        console.log(RegExp.input);
        console.log(RegExp.$_);//必须exec方法执行之后  才会输出待匹配的原字符串
        console.log(RegExp['$_']);
        console.log(RegExp.lastMatch);//js
        console.log(RegExp['$&']);//js    lastMatch的别名
        console.log(RegExp.leftContext);//空字符串   左边剩余的字符串
        console.log(RegExp['$`']);
        console.log(RegExp.rightContext);//右边剩余的字符串
        console.log(RegExp["$'"]);
        console.log(RegExp.lastParen);//j
        console.log(RegExp["$+"]);

        var str = 'js js js';
        var pattern=/(j)s/;
        pattern.exec(str);
        console.log(RegExp.$1);//j  表示捕获的的是第一个分组

        // String和正则表达式相关的方法 ---  search  match  split
        var str = 'html js';
        var pattern=/js/;
        console.log(str.search(pattern));//5

        var str = 'html js';
        var pattern=/js2/;
        console.log(str.search(pattern));//-1

        var str = 'html js js';
        var pattern=/js/g;
        console.log(str.search(pattern));//5

        var str = 'js js js';
        var pattern=/js/;
        console.log(str.match(pattern));

        var str = 'js js js';
        var pattern=/js2/;
        console.log(str.match(pattern));//null

        var str = 'js js js';
        var pattern=/(j)s/;
        console.log(str.match(pattern));

        var str = 'js js js';
        var pattern=/(j)s/g;
        console.log(str.match(pattern));

        var str = '1.js\n2.js\n3.js';
        var pattern=/js/mg;//多行和全局一般会一起使用
        console.log(str);
        console.log(str.match(pattern));

        var str = '1.js\n2.js\n3.js';
        var pattern=/js$/mg;//多行和^$配合使用
        console.log(str);
        console.log(str.match(pattern));

        var str = 'js1\njs2\njs3';
        var pattern=/^js/g;//多行和^$配合使用
        console.log(str);
        console.log(str.match(pattern));

        var str = 'js1\njs2\njs3';
        var pattern=/^js/mg;//多行和^$配合使用
        console.log(str);
        console.log(str.match(pattern));

        var str='html,css,js';
        console.log(str.split(','));

        var str='html,  css  ,  js';
        var pattern=/\s*,\s*/;
        console.log(str.split(pattern));

        var str='I love js js';
        console.log(str.replace('js','html'));

        var str='I love js js';
        var pattern=/js/g;
        console.log(str.replace(pattern,'html'));

        var str='2020-4-1';
        var pattern=/-/g;
        console.log(str.replace(pattern,'.'));

        var str='I love js';
        var pattern=/(js)/;
        document.write(str.replace(pattern,'<strong style="color:red;">$1</strong>'));

        // 常用正则表达式
        // 1.QQ 全是数字\d 首位不能为0[1-9] 最少5位(10000){4,10} 目前最多11位?^$
        // /^[1-9]\d{4,10}$/


        // 2.昵称 中文、英文、数字以及下划线 2-18位
        // /^[\u4e00-\u9fa5a-zA-Z0-9_]{2,18}$/
        // /^[\u4e00-\u9fa5\w]{2,18}$/


        // 3.密码 6-16位 不能用空白字符  \s 区分大小写
        // /^\S{6,16}$/i


        // 4.去除字符串首尾得空白字符
        var str = '   Alex      ';  
        var pattern=/^\s*|\s*$/g; 
        console.log('|'+str.replace(pattern,'')+'|');
        // var pattern=/^\s*/;
        // var pattern=/\s*$/;
        // var pattern=/^\s*$/;//不可以

        var str = '   Alex      '; 
        var pattern1=/^\s*/;
        var pattern2=/\s*$/;
        console.log('|'+str.replace(pattern1,'').replace(pattern2,'')+'|');


        // 去除两边空格得方法
        function trim(str){
            return str.replace(/^\s*/,'').replace(/\s*$/,'');
        }
        var str = '   Alex      '; 
        console.log('|'+trim(str)+'|');

        // 5.转驼峰   colorBtnAge
        // css:background-color:red;
        // js:elem.style.backgroundColor='red';
        // jquery:$(elem).css('background-color','red');
        var str='background-color';
        var str='margin-left';
        var pattern=/-([a-z])/gi;
        console.log(str.replace(pattern,function(all,letter){
            return letter.toUpperCase();
        }));

        // 6.匹配HTML标签 
        var str='<p class="odd" id="odd">123</p>';
        var pattern=/<\/?[a-zA-Z0-9]+(\s+[a-zA-Z]+=".*")*>/g;
        console.log(str.match(pattern));
        //逆向思维
        var str='<p class="odd" id="odd">123</p>';
        var pattern=/<[^>]+>/g;
        console.log(str.match(pattern));
    </script>
</html>