十分钟掌握正则表达式!5_分组匹配_非捕获形分组:前瞻、负前瞻、后顾、负后顾.

本文介绍了JavaScript正则表达式的非捕获分组及其前瞻、后顾分组的应用,包括前瞻型分组查找后继模式、负前瞻避免特定模式、后顾匹配前置条件和负后顾排除条件。通过实例演示如何利用这些高级特性处理复杂字符串匹配问题。
摘要由CSDN通过智能技术生成

1、非捕获__型分组

//	A(?:B)    //有时候,我们只是想分个组,而没有捕获的需求
var str1='abc123'
var reg1=/(?:\w+?)|(?:\d+?)/g
console.log(reg1.test(str1));
console.log(str1.match(reg1));
console.log(RegExp.$1);     // 不会把分组的内容存储到内存中

// 这个例子中,(?:\d{4})分组不会捕获任何串,所以$1为(\d{2})捕获的串。
var reg2 = /(?:\d{4})-(\d{2})-(\d{2})/
var date2 = '2012-12-21'
reg2.test(date2)
console.log(RegExp.$1 );//12
console.log(RegExp.$2 );//21
console.log(RegExp.$3 );//什么也不输出
console.log("----------------------");

2.1、前瞻__型分组:

//	A(?=B)    //查找后面是B的A
var str3 = '123548king'
var reg3 = /\d*(?=king)/g       //尽可能多的查找后面是king的数字
console.log(str3.match(reg3));  //["123548", ""]

2.2、负前瞻__型分组:

//	A(?!B)    //查找后面不是B的A
var pi = '3.141592687**123...'
var pireg2 = /\d+(?!\.)/g       //在全局尽可能多的查找后面不是.的数字
console.log(pi.match(pireg2));  //["141592687", "12"]

2.3、后顾__型分组:

//	(?<=B)A   //查找前面是B的A
var str = 'memejiLove:Lisi,memejiLove:Zhangsan'
var reg = /(?<=memejiLove:)\w*/g   //查找memeji到底爱上了那几个人,
console.log(str.match(reg));       //哦~,原来是→["Lisi", "Zhangsan"]

2.4、负后顾__型分组:

//	(?<!B)A   //查找前面不是B的A
var str = '3.1Windows1,95Windows,NTWindows,NiubIWindows2'
var reg = /(?<!95|NT|2000)Windows\d*/g //匹配Windows前面不是95|NT|2000之一的后缀
console.log(str.match(reg));    //["Windows1", "Windows2"]

3、应用实例(1)

/*
匹配对象前后有固定字符串
我们拉取了后台数据,是个嵌套好多层的json,但是我就想要所有元素的一个字段,并且提取出来,不使用循环,
如果用循环太墨迹了,因为有好几层嵌套。比如:*/
var longstr=`{"departmentId":1,
            "departmentName":"niubi",
                "child":[{"departmentId":2,
                            "departmentName":"测试部门",
                            "child":[{"departmentId":5,
                                    "departmentName":"试试"}
                                    ]},
                        {"departmentId":3,
                        "departmentName":"威风威风",
                        "child":[{"departmentId":6,"departmentName":"试试44"}]
                        },
                        {"departmentId":4,"departmentName":"测试部门2"}
                ]
            }
            `
/*
需求:
    我们要把所有层级的departmentName拿出来  (测试部门、试试.....)
思路:
    前面有个固定字符,后面固定是个引号,由于上面说的js分组无法取全局,所以借助捕获符直接提取目标。
格式::
    就是(?<=前面的字符串)(中间的内容)(?=后面的字符串)。这个分组就是前面说的前瞻后顾捕获。
    代码里中间.*?就是懒惰匹配,就是尽可能短的匹配到中间字符,否则用.*结果就会一直匹配到最后一个部门。*/

var longreg = /(?<="departmentName"\:")(.*?)(?=")/g
console.log(longstr.match(longreg)) //(6) ["niubi", "测试部门", "试试", "威风威风", "试试44", "测试部门2"]
console.log("----------------------");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值