高级正则实例

如何学好正则,一直是我苦恼的事情,有时候我自己的写的正则,自己也不太明白所以然,抱着试试的态度

但是我真的很想学好,这里我都会以实例出来,对每一道正则都写上自己的理解(基础部分我就不写,尽量写一些小细节的点)

部分会参考我看的<>

多选

竖线| 分隔多选,但是|的优先级特别低,可以用括号把他包起来

复杂些|简单写

专门为捕获组设计的exec

超级强大,可惜我今天才发现(2019/05/10)

默认返回的匹配的项,其他匹配的通过是分组的内容,通过[]获取

let str = "aaabbb";
/*可以匹配到分组的内容*/
let reg=/(a+)(?:b+)/g;
let res = reg.exec(str);
console.log(res[1]);

let str = "cccddd";
/*可以匹配到分组的内容*/
let reg=/(c+)(d+)/g;
let res = reg.exec(str);
console.log(res[1]);

比较好的入门资料链接

replace

第二个参数是函数
let url = "https://www.baidu.com?a=1&b=2";
let reg=/([^&#?+]+)=([^&?#+]+)/g;
let obj = {};
//$0  返回整体  $1返回第一个分组  $2 返回第二个分组
url.replace(reg, ($0,$1, $2) => obj[$1] = $2);
console.log(obj);

反向引用

\1 到\10
console.log('aaa bbbb ffffff 999999999'.match(/(\w)(?=\1\1\1)(\1)+/g));

反向引用的作用通常是用来查找或限定重复、查找或限定指定标识配对
([a-z])\1{2}
忽略分组  ?:
正向断言  ?=
反向断言  ?!
    test  判断return false
    exec  查看分组
    search  返回第一个匹配的索引 到不到 -1
    match  返回数组
    split
    replace
//找到重复的单词
const str = 'This is the theater you you have been to to';
str.replace(/\b([a-z]+)\s\1\b/ig,(match,...args)=>{
  console.log(args[0]);
})

环视(多查资料)

环视,在不同的地方又称之为零宽断言,简称断言。
?=P   可定顺序
?!P   否定顺序
?<=P  肯定逆序
?<!P  否定逆序

console.log(/(http|ftp|svn|abc)ddd/g.test('httpddd'));

 定锚点

.*?  如果换行失败 改成 [\s\S]*?  

正整数+一位小数

console.log(/^[+]?[1-9]\d*(?:\.\d)?$/.test('+2.1'));

环视

?=P 肯定 ?!P 否定

(?=A)[A-Z]

(?=A) 所在的位置,后面是A

[A-Z] 匹配A-Z中任意一个字母

组合起来

从左到右正则分别匹配环视(?=A)[A-Z] ,由于环视不消耗正则的匹配字符,因为还能对A进行匹配

 let s1='abcd abcd abbdABCD';
    console.log(s1.match(/(?=a)[a-z]/g)); // ["a","a","a"]
字母序列后面跟着;
    let s1='aaaa;bbb;cccc;dddd;';
    console.log(s1.match(/[a-z]+(?=;)/g)); //["aaaa", "bbb", "cccc", "dddd"]
常规匹配
    let s1 = 'notexefile1.exe';
    console.log(/.+(?=\.exe)/g.exec(s1)); //notexefile1

变种用法

肯定变种

需求包含字母(不区分大小写),数字,6-16为密码
^(?=.*?[a-zA-Z])(?=.*?[0-9])[a-zA-Z0-9]{6,16}$
  讲解
  使用(?=.*?[a-zA-Z])限定后面的字符中至少有一个字母
    使用(?=.*?[0-9])限定后面的字符中至少有一个数字
    最后通过实际匹配正则[a-zA-Z0-9]{6,16}限定量词

否定变种

获取不是.exe后缀文件不含后缀的文件名
正则:(.+)(?!\.exe)\.[^.]+$ 

肯定逆序 (?<=P)

js不支持,但是好像是用webpack的时候是支持的
需求:获取name参数的值
正则:(?<=name=).+
示例很直白,前面必须是name=,然后获取其后面的数据
      let s1 = 'name=Zjmainstay';
    console.log(/(?<=name=).+/g.exec(s1));// Zjmainstay

正则分块组合法-必须包含字母、数字、特殊字符

正则:^(?=.*?[a-z])(?=.*?\d)(?![a-z\d]+$).+$

解析:? (?=.*?[a-z])限制必须有字母

? (?=.*?\d)限制必须有数字

? (?![a-z\d]+$)限制从开头到结尾不能全为数字和字母

? .+在没有限定的情况下可以是任意字符? ^$?限定字符串的开头和结尾

正则逐步完善法-排除特定标签p/a/img,匹配html标签

正则:</?(?!p|a|img)([^> /]+)[^>]*/?>

从简单标签入手,对于</p><br />,写出正则:? </?[^>]*/?>

我们观察可得,标签名是这样得到的:

无属性值:<p>           <([^>]+)
有属性值:<p class      <([^ ]+)
无属性值自闭合:<br/>   <([^/]+)
闭合标签:</p>          </([^>]+)>

得到正则:

</?([^> /]+)

最后,我们需要排除p/a/img标签,用否定顺序法,在标签名前面加入否定环视:? </?(?!p|a|img)([^> /]+)[^>]*/?>

正则减除查错法-匹配异常原因查找

<ul>
    <li class="item">item1</li>
    <li class="item">item2</li>
    <li class="item bug">item3</li>
    <li class="item">item4</li>
    <li class="item">item5</li>
</ul>

正则:<li class="item">(.*?)</li>

问题"item bug" 怎么解决

正则<li class="item[^"]*"

最终的正则<li class="item[^"]*">(.*?)</li>

正则练习题

https://www.zybuluo.com/Zjmainstay/note/709093

匹配个数为偶数且不能为空

/^(..)+$/

正则查找不包含某些字符串

^((?!不想包含的字符串).)*$

解释
(?!不想包含的字符串)   //是匹配位置
.是任意字符
表达式(?!hede).只执行一次
匹配0次或多次:((?!hede).)*

需求:匹配每行数据中以.jpg/.jpeg/.png/.gif结尾的图片名称(含后缀)

.+(?=\.(jpg|jpeg|png|gig)).+

......................................................................................................................................................................................................................................................................................................................................................................................................................

原文地址:https://www.cnblogs.com/fangdongdemao/p/10964189.html

时间: 2024-10-11 13:22:12

高级正则实例的相关文章

Oracle 10g高级复制实例(多主体复制)(转载)

Oracle 10g高级复制实例(多主体复制) 前言: 配置了三次,两次都是单向.最后一次终于是双向的了.也算一点有点成功的喜悦.喜悦?喜悦确实谈不上.这么简单的东西弄了这么久觉得惭愧.网络上的资料一大堆.不过他们写的好象都有些随意.有的时候一点点错误可以使你只有重来.我现在重新写一次.只提供给初学者.配置的高手的就不要开腔了.因为实在不好意思拿出来见人. 信息: 主体定义数据库:testdb.geong.com(弄清楚别弄错了.) 主体数据库:backdb.geong.com 操作系统:  x

2015/12/13 --高级javascript实例和部分javascript对象实例

<html> <head> <script type = "text/javascript"> //替换字符串中的字符--replace()方法 var str = "Do you love me?"; document.write(str.replace (/me/who)); //查找字符串中指定的字符,若找到,返回该字符.---match()方法 var str = "hello kitty"; docu

Sublime Text 高级正则查换替换功能

有一个需求:把某从mysql 里导出的的数据表 数据里的  Insert语句 转换成 update 语句. 须要把例如以下的语句: insert into `table` (`ID`, `code`, `detail`) values('1','110000','XX市'); 改成为:update table set detail = 'XX市' where code = '110000' 研究了好久. 以下是实现方法: 第一. 用sublime 打开数据文件 原数据文件 1. 图一: 原始数据

C#高级------正则验证邮箱

//正则表达式匹配邮箱 Console.WriteLine("请输入邮箱"); string s = Console.ReadLine(); bool b= Regex.IsMatch(s, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"); if(!b) { Console.WriteLine("

javascript高级知识点——实例类型

代码信息来自于http://ejohn.org/apps/learn/. 分析一下对象的结构 function Ninja(){} var ninja = new Ninja(); console.log( typeof ninja == "object", "仍然是对象" ); console.log( ninja instanceof Ninja, "是Ninja的实例" ); console.log( ninja.constructor =

junit基础篇、中级篇、高级篇实例-代码

学习文章: http://blog.csdn.net/andycpp/article/details/1327147 http://wenku.baidu.com/link?url=C27gDEj0l-AyPuyUOOYJaezxGF-U-mozQbjlA-R9apKXdw8h-GV3VoPzS4P4WADISon7615JCLfSpMjtuiqIVcBWJ0o7icgKk_2Qi2jF0yq 实例代码目录结构: Calculator.java: 1 public class Calculato

WebDriver高级应用实例(4)

4.1操作web页面的滚动条 被测网页的网址: http://v.sogou.com Java语言版本的API实例代码 import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import javax.swing.event.TreeWillExpandListener; import org.openqa.selenium.By; import org.openqa.selenium.Jav

WebDriver高级应用实例(10)

10.1控制HTML5语言实现的视频播放器 目的:能够获取html5语言实现的视频播放器视频文件的地址.时长.控制进行播放暂停 被测网页的网址: http://www.w3school.com.cn/tiy/t.asp?f=html5_video_all Java语言版本的API实例代码 package cn.html5; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import

2015/12/12--javascript事件处理和部分高级javascript实例

<html> <head> <script type = "text/javascript"> //创建一个欢迎的cookie function getCookie(c_name){ if(document.cookie.length > 0){ c_start.document.length.indexof(c_name + "="); if(c_start != -1){ c_start = c_start + c_na