js正则进阶要看懂的代码
2023-09-11 14:20:38 时间
- 学习代码前先掌握正则知识点:https://www.bilibili.com/video/BV19t4y1y7qP
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>1</p><p>2</p>
<script>
//懒惰匹配
let text = '<p>1</p><p>2</p>';
let pattern0 = /<p>.*<\/p>/;
let pattern = /<p>.*?<\/p>/;
console.log('贪婪匹配',pattern0.exec(text));
console.log('懒惰匹配',pattern.exec(text));
//分组()
text = "mom and dad and baby";
pattern = /mom( and dad( and baby))/;
console.log('分组',pattern.exec(text));
//非捕获分组(?:)
pattern = /mom(?: and dad)( and baby)/;
console.log('非捕获分组',pattern.exec(text));
//分组的回溯引用
text = '<p>1</p><p>2</p>';
pattern0 = /<(p)>.*<(\/\1)>.*<\1>.*<\2>/;
console.log('分组的回溯引用',pattern0.exec(text));
//命名捕获分组 (?<name>内容) ES9新特性
//如何访问 exec返回结果有个名为groups的属性,该对象里有我们命名的属性
text = "mom and dad and baby";
pattern = /mom(?<dad_baby> and dad(?<baby> and baby))/;
let result = pattern.exec(text);
console.log('命名捕获分组',pattern.exec(text));
console.log(result.groups.dad_baby);
console.log(result.groups.baby);
//正向先行断言 (?=表达式) 指在某个位置向右看,表示所在位置右侧必须能匹配表达式
text ='我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你';
pattern = /喜欢(?=你)/g;
var a;
console.log('正向先行断言', a=pattern.exec(text),'index',a?.index);
console.log('正向先行断言',a=pattern.exec(text),'index',a?.index);
console.log('正向先行断言',a=pattern.exec(text),'index',a?.index);
//反向先行断言(?!表达式)
pattern = /喜欢(?!你)/g;
console.log('反向先行断言', a=pattern.exec(text),'index',a?.index);
console.log('反向先行断言',a=pattern.exec(text),'index',a?.index);
console.log('反向先行断言',a=pattern.exec(text),'index',a?.index);
console.log('反向先行断言',a=pattern.exec(text),'index',a?.index);
//正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
pattern = /(?<=我)喜欢(?=你)/g;
console.log('正向后行断言', a=pattern.exec(text),'index',a?.index);
console.log('正向后行断言',a=pattern.exec(text),'index',a?.index);
//反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
pattern = /(?<!我)喜欢(?!你)/g;
console.log('反向后行断言', a=pattern.exec(text),'index',a?.index);
console.log('反向后行断言',a=pattern.exec(text),'index',a?.index);
//正则扩展:dotAll 模式 ,s代表这个模式
//dot . 元字符 除换行符以外的任意单个字符
let str = `
<ul>
<li>
<a>肖生克的救赎</a>
<p>上映日期: 1994-09-10</p>
</li>
<li>
<a>阿甘正传</a>
<p>上映日期: 1994-07-06</p>
</li>
</ul>`;
//声明正则
// const reg = /<li>\s+<a>(.*?)<\/a>\s+<p>(.*?)<\/p>/;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs;
//执行匹配
// const result = reg.exec(str);
let result0;
let data = [];
while (result0 = reg.exec(str)) {
data.push({ title: result0[1], time: result0[2] });
}
//输出结果
console.log(data);
//断言高级应用
//断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的至少8位字符串
pattern = /(?=.*?[a-z])(?=.*?[A-Z]).{8,}/gm;
pattern0 = /.{8,}(?<=[a-z].*?)(?<=[A-Z].*?)/gm;
text =`
Admin123456
pZUJLUpTL2
Tnut2eWPN1
wJxpVhVYi3
UySRo49ps
Ig7AHzZ0J
oYHMDdHCK9
yiyWKQnWo2
gTZEEkVrj1
8Ij12340as
wdfqe#wefDdf444
Codejiaonang123
CodeJiaonang@qq1
111111abc11ABc
CodeJiaonang123
qwe
8848
123456
asd123
Adm123
Asd123
wjleif932
admin123
123admin
123asd123
ADMIN123()
编号89757
888888888info
masterxiao123
888888888A
`
for (let i =0 ;i<16;i++){
a=pattern.exec(text);
console.log('规范密码方式一', a?a[0]:'没有了');
}
for (let i =0 ;i<16;i++){
a=pattern0.exec(text);
console.log('规范密码方式二', a?a[0]:'没有了');
}
</script>
</body>
</html>
相关文章
- 整理几个被遗忘的js基础代码题,还都能答对吗?
- 玩转代码|js防抖与节流的区别及实现
- js,jq滚动监听,切换等常用JS代码
- 【JS】JavaScript中创建数组的6种方式(代码示例合集)
- 爬虫之JS的解析确定js的位置
- 爬虫之selenium控制浏览器执行js代码
- PEG.js 介绍与基础使用
- JS——offset偏移量及client可视区应用
- 提升代码幸福度,五个技巧减少js开发中的if else语句
- js 获取中文的拼音
- js高级---js架构
- JS模板引擎handlebars.js的简单使用
- webpack5用babel-loader将es6的js代码转换成es5
- WEB前端大作业-简约风格装潢公司设计响应式网页模板(HTML JS CSS))
- 浅析Node.js的宏任务与微任务、本轮与次轮循环、事件循环概念及其6个阶段解析以及代码分析nodejs与浏览器的Event Loop差异
- 浅析这句经常在框架中出现的JS代码加深对bind的理解
- js键盘各键对应的代码
- 【cocos2d-js官方文档】五、Cocos2d-JS v3.0的新Action API
- 关于Cocos Creator用js脚本代码播放骨骼动画的步骤和注意事项
- JS实现不刷新页面进行排序功能
- JQuery/JS插件 linq.js 入门