详解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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
Google Maps API地图应用示例分享
Oct 23 Javascript
window.onload使用指南
Sep 13 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
Ajax实现不刷新取最新商品
Mar 01 Javascript
React Native 使用Fetch发送网络请求的示例代码
Dec 02 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
通过js动态创建标签,并设置属性方法
Feb 24 Javascript
详解JavaScript 的变量
Mar 08 Javascript
javascript实现导航栏分页效果
Jun 27 Javascript
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
PHP学习 变量使用总结
2011/03/24 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
基于vue2.0的活动倒计时组件countdown(附源码下载)
2018/10/09 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
python自动翻译实现方法
2016/05/28 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
使用python3构建文件传输的方法
2019/02/13 Python
Python笔记之工厂模式
2019/11/20 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
浅析python连接数据库的重要事项
2021/02/22 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
党员四风剖析材料
2014/08/27 职场文书
师德标兵事迹材料
2014/12/19 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server