详解JavaScript正则表达式之分组匹配及反向引用
语法
元字符:(pattern)作用:用于反复匹配的分组
属性$1~$9如果它(们)存在,用于得到对应分组中匹配到的子串
\1或$1用于匹配第一个分组中的内容
\2或$2用于匹配第一个分组中的内容
...
\9或$9用于匹配第一个分组中的内容
用法示例
varreg=/(A+)((B|C|D)+)(E+)/gi;//该正则表达式有4个分组 //对应关系 //RegExp.$1<->(A+) //RegExp.$2<->((B|C|D)+) //RegExp.$3<->(B|C|D) //RegExp.$4<->(E+)
以上的代码也同时给出了$1~$9的用法
$1~$9是正则表达式预定义的静态属性,通过RegExp.$1引用
分组嵌套关系说明
上述代码也可以说明分组的嵌套关系
//测试环境Chrome浏览器 varstr="ABCDE"; varreg=/(A+)((B|C|D)+)(E+)/gi; str.match(reg);//输出:["ABCDE"] reg.exec(str,'i');//输出:["ABCDE","A","BCD","D","E"] RegExp.$1;//输出:"A" RegExp.$2;//输出:"BCD" RegExp.$3;//输出:"D" RegExp.$4;//输出:"E"
这样就可以很明白的看出分组的嵌套关系了
总结来说:大的分组中存在小的分组时,小的分组是排在该大分组后面的分组,以此类推
第二部分
这部分主要讲解类似于"\1"这个东西的用法
分组匹配之反向引用
语法
元字符\1~\9作用:用来表示前面以匹配的字符或分组的一个引用
用法示例
参考文章:[原]AS3js正则表达式反向引用(backreference)
上面说的可能有些拗口,下面给一个例子:
//一般情况,当我们想匹配任意两个相同的字符(复杂一点就是两个相同的分组)时,往往可以借助下面的写法 //说明: //(\w)用来匹配任何除了换行和制表符的字符,而\1是对(\w)的一个引用,所以你可以理解成:(\w)\1就是(\w)(\w) //但是, //(\w)\1和(\w)(\w)的不同之处在于,(\w)(\w)表示任意两个连续的字符,比如Ac,MM,K9,都可以, //但(\w)\1只能是AA,CC,99这样连续相同的字符 //所以,你可以这样理解,\1是对(\w)的一个实例化引用,当(\w)匹配到A时,\1被表达成A,当(\w)匹配9时,\1被表示成9 //说了这么多,可能有些废话,下面这个例子就很好理解了 varstr="AAAm99"; varreg=/(\w)\1/g; str.match(reg);//输出:["AA","99"]
所以,参照上边我所引用的文章中给出的"关键字搜索高亮显示的正则表达用法"的例子,我给出自己改进的小的DEMO
虽然这个DEMO没有用到任何的关于反向引用的知识点::>_<::
//测试环境Chrome浏览器 varkey="keywords";//搜索的关键字 vartext="Iamatext,andIhaveakeywordsbeforethis";//待匹配的文本 varreg=newRegExp("("+key+")","g"); text.replace(reg,"<spanstyle='color:red'>$1</span>");//输出:"Iamatext,andIhavea<spanstyle='color:red'>keywords</span>beforethis"
下面给大家详细介绍下正则表达式之反向引用
示例1:
publicstaticvoidmain(String[]args){ Strings="99-3933"; booleanb=Pattern.matches("([\\d])\\1[-]([3])\\1\\2{2}",s); System.out.println(b); }
反向引用,匹配重复的数字
([\d])====>\1
([3])====>\2
示例2:
publicclasstest{ publicstaticvoidmain(String[]args){ Strings="99-393399-3933"; booleanb=Pattern.matches("(([\\d])\\2[-]([3])\\2\\3{2})\\1",s); System.out.println(b); } }