详解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 相关文章推荐
js弹出层永远居中实现思路及代码
Nov 29 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
Dec 16 Javascript
用unescape反编码得出汉字示例
Apr 24 Javascript
AngularJS 单元测试(二)详解
Sep 21 Javascript
JavaScript中splice与slice的区别
May 09 Javascript
JavaScript实现时间表动态效果
Jul 15 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
Sep 18 Javascript
vue生命周期实例小结
Aug 15 Javascript
nuxt.js中间件实现拦截权限判断的方法
Nov 21 Javascript
关于js陀螺仪的理解分析
Apr 11 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
JavaScript console的使用方法实例分析
Apr 28 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
Vue.js原理分析之nextTick实现详解
2020/09/07 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
python+opencv实现车道线检测
2021/02/19 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
澳洲的服装老品牌:SABA
2018/02/06 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
优秀的自荐信要注意哪些
2014/01/03 职场文书
公司委托书怎么写
2014/08/02 职场文书
坎儿井导游词
2015/02/09 职场文书
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
Oracle使用别名的好处
2022/04/19 Oracle