JavaScript 正则表达式学习

本文主要内容是本人学习正则的记录,包括最基本的概念及基本的应用。

一直想学习正则表达式,但又被看不懂的火星文一次次吓到,终于静下心来从零学习,其实学进去,明白一些正则的规则,其实也没有想象中的那么可怕。

总体来说这次的学习正则的最基本的要求已实现,但是自己内心里还是很清楚的明白,自己只是学习一点点而已,能总结的也只是部分,网上前辈总结的很多,也很全面,这里就记录一下我的学习记录,以便后面再学习回忆,如有错误,请指正。

下面将直接贴出代码:

<script type="text/javascript">
        $(function(){
            
            // ***************************************************************************************//
            // test方法,测试字符串,符合模式时返回true,否则返回false 
            // ***************************************************************************************//
            var re = /he/;        //含有 he 字符的  
            //var re = new RegExp(/he/);
            var s = "he";
            //console.log(re.test(s)); //true
            //var s1 = "He";
            //console.log(re.test(s1)); //false
            
            //var re1 = /he/i;            //如果要大小写都匹配可以指定i标志(i是ignoreCase或case-insensitive的表示) 
            //console.log(re1.test(s1)); //true
            
            s = "hi ,she is a pretty girl!";
            
            //console.log(re.test(s)); // true 
            
            //  ^
            re = /^he/            // 以he开头的字符串 
            //console.log(re.test(s)); //false
            
            s = "he is a pretty girl!";
            //console.log(re.test(s)); //true
            
            s = "He is a pretty girl!";
            //console.log(re.test(s)); //false
            
            //console.log(/he/i.test(s)); //忽略大小写 
            
            // $
            re = /he$/i;   //$表示字符结束位置 /he$/i 表示忽略大小写且以he结尾 
            
            //console.log(re.test("he is")); //false
            
            //console.log(re.test("he")); //true
            
            //console.log(re.test("he ")); //false
            
            //console.log(re.test("rHE"));//true
            
            // \s
            
            re = /\s/; //\s匹配任何空白字符,包括空格、制表符、换页符等等  
            s = "she is";
            //console.log(re.test(s));//true
            //console.log(re.test("sheis")); //false
            //console.log(re.test("she    is"));//true  中间是制表符 tab键
            
            re = /[a-z]/ ;//[]匹配指定范围内的任意字符,这里将匹配英文字母
            s = "beauty";
            //console.log(re.test(s));//true
            
            //console.log(re.test("Beauty")); //true
            
            re = /^[a-z]/ ;//匹配a-z的字母,这里是小写字母,必须是开头 
            //console.log(re.test("Beauty")); //false
            
            re = /^[a-z]/i;  //不区分大小写,以字母开头
            //console.log(re.test("beauty")); //true
            //console.log(re.test("Beauty")); //true
            //console.log(re.test("12Beauty"));//false
            
            re = /[A-Z]/;  //匹配A-Z的字母,这里是大写字母 
            //console.log(re.test("abc"));//false
            //console.log(re.test("Abc"));//true
            
            re = /[A-Z]/i
            
            //console.log(re.test("12Bs")); //true
            
            re = /^[A-Z]/i
            //console.log(re.test("12Bs"));//false
            
            //console.log(re.test("Ab12c4")); //true
            
            re = /\d/;   //匹配数字 0-9,字符串中含有数字即可 
            //console.log(re.test("sdf")); //false
            //console.log(re.test("1223")); //true
            //console.log(re.test("12w12ew")); //true
            
            re = /^[a-z]+\s+\d+$/i ; //表示 以小写字母开头,\s表示空格 ,\d 表示 数字,+ 表示至少出现一次,i 表示忽略大小写 
            s = "jdk 7";
            //console.log(re.test(s));//true
            
            // ***************************************************************************************//
            // 另一个方法exec,返回一个数组,数组的第一个元素为完整的匹配内容  
            // 注意,当字符串不匹配re时,exec方法将返回null
            // ***************************************************************************************//
            var arr = re.exec(s);
            //console.log(arr.length); // 1
            //console.log(arr[0]); // jdk 7
            
            re = /\d/; //输出是那个字符匹配了正则的模式 
            var arr = re.exec(s);
            //console.log(arr.length); // 1
            //console.log(arr[0]); // 7
            
            s = "jdk 7 8";
            arr = re.exec(s);
            //console.log(arr.length); //1
            //console.log(arr[0]); // 7 这里还是7,其实我想把数字都输出,怎么玩?
            
            re = /^[a-z]+\s+(\d+)$/i;
            s = "jdk 7";
            
            arr = re.exec(s);
            //console.log(arr.length); // 2
            //console.log(arr[0]); // jdk 7
            //console.log(arr[1]); // 7
            
            re = /^[a-z]+\s+(\d+)\.(\d+)$/i; // 这里要说明的是 \. 是什么意思, .在正则里是元字符之一,要使用.的本意, 需要转译才可使用,正则里有那些元字符? ( [ { \ ^ $ | ) ? * + .  
            s = "jdk 7.8";
            arr = re.exec(s);
            //console.log(arr.length); //3
            //console.log(arr[0]); // jdk 7.8
            //console.log(arr[1]); // 7
            //console.log(arr[2]); // 8
            
            re = /^[a-z]+\s+(\d+)+\s+(\d+)$/i; //这里就解决了上面的那个问题 ^_^!
            s = "jdk 7 8";
            arr = re.exec(s);
            //console.log(arr.length);// 3
            //console.log(arr[0]); // jdk 7 8
            //console.log(arr[1]); // 7
            //console.log(arr[2]); // 8
            
            // ***************************************************************************************//
            // 关于字符串的操作 
            // 1、s.replace(regexp, replaceValue) 第一个参数 可以是正则表达式 第二个参数是被替换的字符        //
            // ***************************************************************************************//
            
            s = "some thing";
            re = /\s/;
            //console.log(s.replace(re, "-")); //some-thing
            //console.log(s.replace(re,"")); //something
            
            s = "some  thing is"; //里面有两个空格 
            re = /\s+/;
            //console.log(s.replace(re, "*")); //some*thing is
            
            re = /\s+/g;   // g 是什么意思? g是全局标志,将使正则表达式匹配整个字符串
            //console.log(s.replace(re, "*")); //some*thing*is
            
            s = "some thing is";
            re = /\s/;
            //console.log(s.split(re)); // ["some", "thing", "is"]
            
            s = "ab+c_s-d";
            re = /[^a-z]/i;  //注意这里的 [^a-z]与^[a-z]的区别 
            //console.log(s.split(re)); //["ab", "c", "s", "d"]
            
            s = "ab+c_s-d+ABc+Sb";
            //console.log(s.split(re));  //["ab", "c", "s", "d", "ABc", "Sb"]
            
            s = "ab+c_s-d+ABc+Sb*ds&012%e";
            //console.log(s.split(re));    //["ab", "c", "s", "d", "ABc", "Sb", "ds", "", "", "", "", "e"]
            //上面三组比较有意思,看出来区别了 ,^[a-z] 表示的是 以a-z字母开头 [^a-z] 表示取 a-z的补集 ,前辈说是表示一个负字符集,什么是负字符集? 
            
            
            //search(regexp) 返回查找到的字符串开始下标  当search方法没有找到匹配时,将返回-1 
            s = "jdk 7";
            re = /\d+/;
            //console.log(s.search(re)); // 4 
            s = "jdk 7";
            re = /\d+/g;  //
            //console.log(s.search(re)); // 4 ,我感觉g标志是多余的
            
            //match()
            s = "My name IS JAck!";
            re = /[A-Z]/;
            arr = s.match(re);
            //console.log(arr.length);  // 1
            //console.log(arr[0]); //M
            
            re = /[A-Z]/g;
            arr = s.match(re);
            //console.log(arr.length);  // 5
            //console.log(arr);   //["M", "I", "S", "J", "A"]
            
            re = /[a-z]/i; //将[a-z]字符串输出  
            //console.log(re.source);
            
            re = /\d/;
            //console.log(re.source);
            
            //s = "aghf12";
            //console.log(re.test(s));
            
            re = /\w/;
            s = "*12**";
            //console.log(re.test(s));
            
            var html = "<p><a href='http://www.cnblogs.com/rubylouvre/'>Ruby Louvre</a>by <em>司徒正美</em></p>";
            //var text = html.replace(/<(?:.|\s)*?>/g, "");
            //alert(text)
            re = /<[^<>]+>/g; // 除去 标签,获取标签内的内容 
            
            //alert(html.replace(re,''));  //Ruby Louvre  司徒正美
            
            s = "yulu359864900@163.com";
            //验证邮箱,首先@前是由字母、数字、下划线组成,@后是数字、字母,然后. .后是cn或者com等,必须是字母,且位数2到4为
            re = /^\w+@[0-9a-z]+\.[a-z]{2,4}$/;   
            // 注意这里的行首^ 行尾$   ^在[]外表示行首,在[]内表示非,交集
            //alert(s+" : "+re.test(s));
            
            s = "13538205813";
            // 手机号 第一位是1,这个是必须的,第二位 有 3、5、8,就这三个数字,第三位到第十一位0-9,共十一位 
            re = /^1[358]\d{9}$/g;
            
            // 注意这里{},{9}表示长度是9,\d{9}表示数字的长度必须是9,也就是有9个数字
            // 刚才写成这个样子,\d+{9},然后报了错,
            // +号是什么意思呢? 其实 + 可以写成{1,} 表示出现1次或者任意次
            // {9} 表示 出现的次数是9,也就是长度是9
            // {9,} 表示 出现的次数字是9,没有上限的次数  >=9
            // { ,9} 表示 出现的次数对多是9,没有下限 <=9
            // * 可以写成{0,},表示任意次,出现的次数任意 
            // ? 可以写成{0,1} ,表示出现的次数是0次或者1次 
            // 正则报错是不给提示的,所以谨记 
            
            //alert(re.test(s));
            
            s = "359864900";
            // QQ 号码 共5到12位,第一位不能为0,剩下的几位为0-9任意数字 
            re = /^[1-9]\d{4,11}$/;
            //alert(re.test(s));
            
            s = "你好说的dsdsd";
            re = /[\u4e00-\u9fa5]+/g;
            // 校验 字符串中是否含有中文 
            // re = /[\u4e00-\u9fa5]/  用于匹配单个汉字。
            // utf-8编码 u4e00 是utf-8编码顺序中的第一个汉字,u9fa5表示最后一个汉字
            //alert(re.test(s));  [^\u4e00-\u9fa5]
            
            s = "  [a b c]  ";
            re = /\s+/g; //去掉所有空格 
            
            //alert(s.replace(re,'')); //abc
            
            re = /^\s+/g; //去掉前面的空格 
            //alert(s.replace(re,'')); //a b c
            
            re  = /\s*$/g;
            //alert(s.replace(re,''))            
            
            re = /^\s*|\s*$/g;
            
            alert(s.replace(re,''));
            
            // ***************************** 小结 **********************************************************//
            // 正则表达式 基本都是perl方式。
            // var re = /he/;  等价于  var re = new RegExp(/he/); 习惯使用前者的写法 
            //
            //.   任意字符,表示什么都可以表示,数字、字母、空格等
            // \d [0-9]digital 数字
            // \D [^0-9]除了0-9
            // \w word 表示[0-9a-z_]
            // \W [^0-9a-z_]
            // \s space 表示空格 空白
            // \S 表示除了空格空白之外的所有东西
            // g global 全局  i ignore 忽略大小写  平时的写法可以 gi 或者 ig 
            // search(re) 字符串搜索,返回匹配的出现的位置
            // match(re) 获取匹配的项目,如找出所有数字 
            // test("abc") 根据正则匹配,看是否符合 匹配规则 符合 true 否则 false 
            //    ( [ { \ ^ $ | ) ? * + .   正则的元字符 
            // [] |就是或的意思,和 []意思一样,凡是出现在[]中的都是或的范围之内的
            // (1|2|3|4) 可以写为[1234]
            // 区分 ^[0-9] 与 [^0-9] 前者表示 以数字0-9开头,后者表示 以除了0-9任意字符开头 
            // ^ 与 $ 前者表示以此开头,后者表示以此结尾 
            // ***************************************************************************************//
        });
    
    </script>

   参考资料:

  JavaScript正则表达式

  精通 JavaScript中的正则表达式

  正则表达式速查表

posted @ 2016-10-11 16:23  heyLuer  阅读(186)  评论(0编辑  收藏  举报