详解JavaScript正则表达式之分组匹配及反向引用


Posted in Javascript onMarch 09, 2016

语法

元字符:(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

作用:用来表示前面以匹配的字符或分组的一个引用

用法示例

参考文章:[原]AS3 js正则表达式 反向引用(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
//说了这么多, 可能有些废话, 下面这个例子就很好理解了
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); 
 } 
}
Javascript 相关文章推荐
css把超出的部分显示为省略号的方法兼容火狐
Jul 23 Javascript
JavaScript 常见对象类创建代码与优缺点分析
Dec 07 Javascript
javascript正则表达式中参数g(全局)的作用
Nov 11 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
Jan 23 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
jQuery制作仿Mac Lion OS滚动条效果
Feb 10 Javascript
jQuery实现网页抖动的菜单抖动效果
Aug 07 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
Jan 14 Javascript
什么是JavaScript注入攻击?
Sep 14 Javascript
如何抽象一个Vue公共组件
Oct 17 Javascript
JQuery复选框全选效果如何实现
May 08 jQuery
javascript html5移动端轻松实现文件上传
Mar 27 #Javascript
javascript事件绑定学习要点
Mar 09 #Javascript
js实现分割上传大文件
Mar 09 #Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
Mar 09 #Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 #Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 #Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
Mar 08 #Javascript
You might like
全文搜索和替换
2006/10/09 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
js实现登录验证码
2016/12/22 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
js 索引下标之li集合绑定点击事件
2018/01/12 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
python实现排序算法
2014/02/14 Python
Python中random模块用法实例分析
2015/05/19 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
Python 实现中值滤波、均值滤波的方法
2019/01/09 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
可以在一个PHP文件里面include另外一个PHP文件两次吗
2015/05/22 面试题
音乐表演专业毕业生求职信
2013/10/14 职场文书
会计专业求职信范文
2014/03/16 职场文书
六一节目主持词
2014/04/01 职场文书
四风个人对照检查材料思想汇报(办公室通用版)
2014/10/07 职场文书
颐和园导游词400字
2015/01/30 职场文书
pycharm debug 断点调试心得分享
2021/04/16 Python
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS