JS正则表达式实例分析(3)

全局匹配:如果是全局匹配,可以通过while循环 找到每次匹配到的字符串,以及子项。每次匹配都接着上次的位置开始匹配

var testStr = "now test001 test002"; var re = /test(\d+)/g; var r = ""; //匹配两次 每次匹配都接着上一次的位置开始匹配,一直匹配到最后r就为false,就停止匹配了 匹配到test001 test002 while(r = re.exec(testStr)){ alert(r);//返回每次匹配成功的字符串,以及子项,分别弹出 :test001 001,test002 002 alert(r.input); //分别弹出: now test001 test002 now test001 test002 alert(r[0]); //代表每次匹配成功的字符串 分别弹出: test001 test002 alert(r[1]); //代表每次匹配成功字符串中的第一个子项 (\d+) 分别弹出:001 002 alert(r.index ); // 每次匹配成功的字符串中的第一个字符的位置,分别弹出:4 12 alert(r.length); //分别弹出:2 2 }

[] : 表示某个集合中的任意一个,比如 [abc] 整体代表一个字符 匹配 a b c 中的任意一个,也可以是范围,[0-9] 范围必须从小到大 。

[^a] 整体代表一个字符   :^写在[]里面的话,就代表排除的意思

例子:匹配HTML标签 比如<div >

var re = /<[^>]+>/g; //匹配左括号 中间至少一个非右括号的内容(因为标签里面还有属性等一些东西),然后匹配右括号 var re = /<[\w\W]+>/g; //匹配左括号 中间至少一个字符或者非字符的内容,然后匹配右括号
// 其实就是找到左括号,然后中间可以有至少一个内容,一直到找到右括号就代表是一个标签。

转义字符

\s : 空格
\S : 非空格
\d : 数字
\D : 非数字
\w : 字符 ( 字母 ,数字,下划线_ )
\W : 非字符
.(点)——任意字符
\. : 真正的点
\b : 独立的部分 ( 起始,结束,空格 )
\B : 非独立的部分

关于最后两个来看个栗子:

var str = 'onetwo'; var str2 ="one two"; var re = /one\b/; // e后面必须是独立的 可以是起始,空格,或结束 alert( re.test(str) ); //false alert( re.test(str2) );//true

例子:写一个用class名获取节点的函数:

我们之前可能见过这样的函数:

function getByClass(parent,classname){ if(parent.getElementsByClassName){ return parent.getElementsByClassName(classname); } else{ var results = new Array();//用来存储所有取到的class为box的元素 var elems = parent.getElementsByTagName("*"); for(var i =0;i<elems.length;i++){ if(elems[i].className==classname){ results.push(elems[i]); } } return results; } }

其实这是存在问题的,比如它如果一个标签里面有两个class,或者存在相同名字的class,比如<div >

function getByClass(parent,classname){ if(parent.getElementsByClassName){ return parent.getElementsByClassName(classname); }else{ var arr = []; var aEle = parent.getElementsByTagName('*'); //var re = /\bclassname\b/; //不能这样写,当正则需要用到参数时候,一定要用全称的写法,简写方式会把classname当做一个字符串去匹配。 var re = new RegExp('\\b'+classname+'\\b'); // 匹配的时候,classname前面必须是起始或者空格,后面也是。 默认匹配成功就停止,所以就算有重复的也不会再匹配进去了。 //需要注意的是,全称的方式声明正则的时候,参数是字符串类型的,所以我们用的时候,需要保证这些特殊的字符在字符串内也能输出才行。\b本身是特殊字符,在字符串中无法输出,所以要加反斜杠转义才行。 for(var i=0;i<aEle.length;i++){ if( re.test(aEle[i].className) ){ arr.push( aEle[i] ); } } return arr; } }

\a 表示重复的某个子项 比如:

\1 重复的第一个子项

\2 重复的第二个子项

/ (a) (b) (c) \1/-----匹配 abca / (a) (b) (c) \2/------匹配 abcb

例子(面试题中经常问到):找重复项最多的字符个数

split():字符串中的方法,把字符串转成数组。

sort():数组中的排序方法,按照ACALL码进行排序。

join():数组中的方法,把数组转换为字符串

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/60dfad2979810820f053802721ce6552.html