详解JavaScript正则表达式之分组匹配及反向引用
来源: 阅读:1058 次 日期:2016-07-21 15:27:24
温馨提示: 小编为您整理了“详解JavaScript正则表达式之分组匹配及反向引用”,方便广大网友查阅!

这篇文章主要介绍了详解JavaScript正则表达式之分组匹配及反向引用 的相关资料,需要的朋友可以参考下

语法

元字符:(pattern)  作用:用于反复匹配的分组

属性$1~$9  如果它(们)存在,用于得到对应分组中匹配到的子串 

\1或$1  用于匹配第一个分组中的内容

\2或$2  用于匹配第一个分组中的内容

...

\9或$9  用于匹配第一个分组中的内容

用法示例

var reg = /(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浏览器

var str = "ABCDE";

var reg = /(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  作用:用来表示前面以匹配的字符或分组的一个引用

用法示例

上面说的可能有些拗口,下面给一个例子:

//一般情况,当我们想匹配任意两个相同的字符(复杂一点就是两个相同的分组)时,往往可以借助下面的写法

//说明:

//(\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

//说了这么多, 可能有些废话, 下面这个例子就很好理解了

var str = "AA Am 99";

var reg = /(\w)\1/g;

str.match(reg);//输出: ["AA", "99"]

所以, 参照上边我所引用的文章中给出的 "关键字搜索高亮显示的正则表达用法" 的例子, 我给出自己改进的小的DEMO

虽然这个DEMO没有用到任何的关于反向引用的知识点::>_<::

//测试环境 Chrome浏览器

var key = "keywords";//搜索的关键字

var text = " I am a text, and I have a keywords before this";//待匹配的文本

var reg = new RegExp("("+key+")","g");

text.replace(reg,"<span style='color:red'>$1</span>");//输出: " I am a text, and I have a <span style='color:red'>keywords</span> before this"

下面给大家详细介绍下正则表达式之反向引用

示例1:

public static void main(String[] args) { 

 String s="99-3933"; 

 boolean b=Pattern.matches("([\\d])\\1[-]([3])\\1\\2{2}", s); 

 System.out.println(b); 

}

反向引用,匹配重复的数字

([\d])====>\1

([3])====>\2

示例2:

public class test { 

 public static void main(String[] args) { 

  String s="99-393399-3933"; 

  boolean b=Pattern.matches("(([\\d])\\2[-]([3])\\2\\3{2})\\1", s); 

  System.out.println(b); 

 } 

}

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map