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>
参考资料: