var str="abca"; var re=https://www.jb51.net/(a)(b)(c)\1/ ; //true,为什么不用var re=https://www.jb51.net/(a)(b)(c)\a/ ;一样能匹配成功,\数字,用于不确定的子项字符 var re=https://www.jb51.net/(a)(b)(c)\2/ ; //false alert(re.teat(str));
例子:找某个字符串中出现最多的字符和它一共出现多少次
var str="vbbbbhybbfhbbgbbb"; var arr=str.split(""); str=arr.sort().join(""); var value=""; //存放出现最多的字符 var index=0; //存放次数 var re=https://www.jb51.net/(\w)\1+/g;
没有\1,re就是一整个排好序的字符串,有了\1就是出现过的有重复的取出来像这样bbb...,hh
str.replace(re,function($0,$1){ //$0代表整体,$1代表第一个子项 if(index<$0.length){ //$0:每一组重复的元素 index=$0.length; value=$1; } }) alert('出现最多的字符是'+value+',出现次数是'+index);
\b(\B):独立的部分(非独立的部分) 独立的部分(起始、结束、空格)
如:
var str="onetwo"; var re=https://www.jb51.net/\bone/; //起始位置,true var re=https://www.jb51.net/one\b/; //false,要true,one和two之间加空格或者只有one alert(re.test(str));
独立部分应用举例
之前有用到用封装好的函数来获取className
function getByClass(oparent,sClass){ var aEle=oparent.getElementsByTagName("*"); var aResult=[]; var i; for(i=0;i<aEle.length;i++){ if(aEle[i].className==sClass){ aResult.push(aEle[i]); } } return aResult; };
这个会有bug
<div></div> <div></div> <div></div>
用这个方法获取box1,只能获取到第一个
用正则来改写
function getByClass(oparent,sClass){ var aEle=oparent.getElementsByTagName("*"); var aResult=[]; var i; var re=new RegExp('\\b'+sClass+'\\b') for(i=0;i<aEle.length;i++){ if(re.test(aEle[i].className)){ aResult.push(aEle[i]); } } return aResult; };
六.量词
不确定的字符个数
量词:{}
{4,7} 最少出现4次,最多出现7次
{4,} 最少出现4次
{4} 正好出现4次
+是{}的简写,相当于(1,)
? 相当于{0,1} //出现0次或者1次
* 相当于{0,} //至少出现0次,可以没有
七.正则收尾
^:正则的最开始位置,表示起始的意思
$:正则的最后,表示结束的意思
例子:去掉字符串里的空格
var re=https://www.jb51.net/^\s+|\s+$/g; str.replace(re,"");
例子:检测邮箱
var re=https://www.jb51.net/^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/;
八.前向声明和反前向声明
(?=) :前向声明
(?!):反前向声明
举例
var str="abacad"; var re=https://www.jb51.net/a(?=b)/g; str=str.replace(re,"*"); alert(str);
输出:*bacad
如果改为
var re=https://www.jb51.net/a(?!b)/g;
输出:ab*c*d
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具: