正则表达式匹配不包含特定字符串解决匹配溢出问题

匹配溢出问题在正则表达式当中算是比较常见的问题,它常常导致我们匹配结果莫名其妙的出错,本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题。

那么,什么是匹配溢出呢?
下面我们来看个例子:

源文本:<div>ABC</div><div>123</div>
目标匹配数据:<div>123</div>
正则:<div.*?>\d+</div>
实际匹配:<div>ABC</div><div>123</div>

这个例子,我们匹配的数据偏移了目标匹配数据,但却包含目标匹配数据,我们就可以认为,前面部分的正则,因为通配符.*?的限定范围比较大,对很多字符做了非预期匹配,也就是匹配溢出了。

对于这个问题,我们可以通过降低通配符的限定范围,从而使得它对于前面部分的匹配因为无法满足正则而退出,最终匹配到我们的目标数据。
因此,上面正则表达式可以修改为:

<div[^>]*?>\d+</div>

这样修改之后,通配部分最多只能匹配div标签里的到达>前的字符,就不会怕它因为通配匹配掉下一个<div>标签了。

因为上面式子中是对>做了排除匹配,它无论如何也不会超出>字符的范围,因此,上面正则从性能角度可以修改为:

<div[^>]*>\d+</div>

因为,假如<div>标签当中还有其他的噪点数据如<div class="xxx">,我们使用非贪婪模式,就会形成多次的回溯,降低性能。此时适当使用贪婪模式,可以让它里面匹配到<div之后,>之前的所有噪点数据,无需回溯,性能会有所提升。
上面例子是针对单字符,使用排除特定字符方法,限定通配符的匹配范围。而我们应用过程中,还经常会遇见多字符的排除匹配情况,下面我们来看看。

源文本:
http://www.zjmainstay.cn
http://www.baidu.com
http://www.qq.com目标数据:每行一个域名,取出不是百度的域名
正则:/^http:\/\/((?!baidu).)+$/m
匹配结果:
http://www.zjmainstay.cn
http://www.qq.com说明:正则里/m的m表示多行模式

可能很多人看到((?!baidu).)+就立马懵逼了。其实,这个表达式也没那么难,大家可以这么理解:
假设是排除一个单字符>,至少有一个字符,你是不是会写:[^>]+
没错,那我要求你一定要用否定正向环视去做呢?你会写成:(?!>).
限制当前位置后面的字符不能是>,完全没有问题,上面两个是等价的。
那么,假设我限定当前位置后面不是baidu呢?这时候,很明显对于单字符排除就不太好写了,因为我们知道正则是单字符匹配的,用单字符匹配就是排除各种b、a、i、d、u的组合,想想都不可完成。但我们可以用否定正向环视轻松解决:(?!baidu).
那么问题来了,我要匹配这一串字符中每个位置都不能是baidu,也就是:

(?!baidu).(?!baidu).(?!baidu).(?!baidu).(?!baidu).(?!baidu).(?!baidu).(?!baidu).(?!baidu).

谁知道有几个位置呢?(上面的(?!baidu).个数仅做示例)
因此,根据题目,至少会有一个(?!baidu).吧,因此,正则修改为:

((?!baidu).)+

也就得到了我们上面的式子了。此时的(?!baidu).其实可以看做一次匹配,就是匹配.(?!baidu)限定它与其后其他字符不能构成baidu
((?!baidu).)的括号只是把这个整体框起来,用于次数限定而已。

参考资料:
更多关于正则表达式入门的内容,请参考本站博客《我眼里的正则表达式入门教程》
正则表达式高级的内容,请参考本站博客《深入讲解正则表达式高级教程》
Windows正则表达式测试工具请从《正则表达式测试工具RegexBuddy-4.1.0》下载
Mac正则表达式测试工具请从《Mac正则表达式测试工具》下载

文章首发自Zjmainstay学习笔记《正则表达式匹配不包含特定字符串解决匹配溢出问题》

转载于:https://www.cnblogs.com/Zjmainstay/p/regexp-match-overflow-solution.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

numpy——mgrid

x1,x2 np.mgrid(x1min:x1max:num1j,x2min:x2max:num2j)x1返回的是x1min到x1max间均匀分成num1个数&#xff0c;进行横向扩展为方阵 x2返回的是x2min到x2max间均匀分成num2个数&#xff0c;进行纵向扩展为方阵 Examples -------- >>> np.mgrid[0:5,0:5] array([[[0,…

Halcon例程(基于3D形状匹配识别方法)详解 —— create_shape_model_3d_lowest_model_level.hdev

一、例程简介 最近在研究3D识别方面的东西&#xff0c;查了不少资料&#xff0c;发现halcon里有不少关于三维物体识别的例程&#xff0c;这里对其中一个做出详解。该例程是基于三维匹配方法的&#xff0c;因为有三维模型SM3&#xff0c;所以不需要自己创建&#xff1b;另因为例…

15.瀑布流、测量

排行界面TopProtocol &#xff1a;json数据就是写字符串&#xff0c;所以不需要写bean对象public class TopProtocol extends BaseProtocol<List<String>> { Override public List<String> paserJson(String json) { List<String> datasnew ArrayList&…

linear-gradient线性渐变

background:linear-gradient(180deg, sliver 20%, skyblue 80%, gray 100%);180deg 是线性渐变的角度,水平方向;如果是90deg,则是垂直方向. silver 20% 是最上面的颜色和该颜色所在的位置,可以为负值,,如 linear-gradient(180deg, silver -7%, pink 80%, skyblue 127%);的效果是…

numpy——stack

np.stack(array,axis,outNone)&#xff0c;函数原型。 其中最重要是的这个axis怎么理解的。 举例说明&#xff1a;arrays [np.random.randn(3, 4) for _ in range(10)] 会生成一个 10 *( 3 * 4 )的矩阵列表。十个矩阵&#xff0c;每个矩阵是(3 * 4)大小。 首先说明一下axis的映…

C# —— 简单工厂设计模式详述

一、基本概念 众所周知&#xff0c;C#是一种面向对象的语言&#xff0c;而其中封装&#xff0c;继承&#xff0c;多态是面向对象的三大重要特征&#xff0c;简单工厂的设计模式则可以完全体现这些特征。要彻底理解这个模式&#xff0c;必须要先将封装&#xff08;访问修饰符的…

【计算机视觉】计算机视觉、模式识别、机器学习常用牛人主页链接

计算机视觉、模式识别、机器学习常用牛人主页链接 牛人主页&#xff08;主页有很多论文代码&#xff09; Serge Belongie at UC San DiegoAntonio Torralba at MITAlexei Ffros at CMUCe Liu at Microsoft Research New EnglandVittorio Ferrari at Univ.of EdinburghKristen G…

C# 中的 ConfigurationManager类引用方法

c#添加了Configuration;后&#xff0c;竟然找不到 ConfigurationManager 这个类&#xff0c;后来才发现&#xff1a;虽然引用了using System.Configuration;这个包&#xff0c;但是还是不行的。 后来终于找到一个解决方法&#xff0c;就是在解决方案资源管理器里找到类文件选择…

机器学习——支持向量机SVM之python实现简单实例一(含数据预处理、交叉验证、参数优化等)

目录 一、SVM理论 二、numpy的相关函数介绍 三、python实现之准备 1、数据集的下载

工业相机常用类型详述

一、工业相机定义 工业相机是应用于工业领域、安防和交通等对相机要求较高领域的摄像机&#xff0c;功能就是将光信号转变成有序的电信号&#xff0c;此信号经过模数转换为数字信号&#xff0c;然后传递给图像处理器。与一般的家用相机相比&#xff0c;其具有更高的稳定性能&a…

机器学习——SVM之python实现数据样本标准化和归一化

目录 一、标准化和归一化的目的 1、标准化 2、归一化 二、标准化和归一化常用的理论公式 1、归一化 2、标准化 三、python实现SVM样本数据标准化和归一化 1、标准化 2、归一化 本文源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》 一、标准化…

[黑群晖经典教程] 一步一步建立自己的黑群晖

【申明&#xff1a;本文并非本人所作&#xff0c;为内部网络中一位大神所写&#xff0c;个人觉得写得很好&#xff0c;遂原文搬了过来&#xff0c;如有侵犯原作者的权利&#xff0c;请及时与我联系】 PS:有好几个兄弟觉得我擅自转发&#xff0c;不是很妥。解释一下&#xff1a;…

Java为什么能跨平台运行

因为java程序编译之后的代码不是能被硬件系统直接运行的代码&#xff0c;而是一种“中间码”--字节码。不同的硬件平台上装有不同的java虚拟机&#xff08;JVM&#xff09;&#xff0c;由JVM来把字节码再翻译成所对应的硬件平台能够执行的代码&#xff0c;因此java可以跨平台运…

C++和Opencv4.5 实现全景图像拼接

前言 最近刚下了最新版的opencv4.5&#xff0c;急不可待的试下操作&#xff0c;就用了opencv自带的Stitcher类拼接下图像&#xff0c;结果傻眼了&#xff0c;程序显示Stitcher没有createDefault成员&#xff0c;看了好久&#xff0c;终于找到了解决方法。 Stitcher原理 Stit…

机器学习——python实现SVM模型w,b的查看

基于源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》进行讲解 1、线性模型 这里以二特征三类&#xff0c;一对多策略为案例 kernel “linear”&#xff1a;线性核&#xff0c;参数有w&#xff0c;b 线性模型的决策边界是&#xff1a;w0iTx0i w1i…

Codeforces-712C-Memory and De-Evolution

转载于:https://www.cnblogs.com/GrowingJlx/p/6642764.html

移动端输入框弹出键盘控制

在移动端&#xff0c;我们公司通过输入框主要收集用户的姓名和电话&#xff0c;以下是对输入框获取焦点时&#xff0c;控制弹出键盘的样式来增强用户体验。 输入姓名 我们的用户都是中国人&#xff0c;输入用户名为中文&#xff0c;所以弹出键盘是输入中文状态即可&#xff0c;…

Opencv4.5-C++ 摄像头画面镜像显示及文件保存

前言 想试下新买电脑的摄像头好用不&#xff0c;就写了个摄像头调用程序&#xff0c;实现了镜像和图片截取保存。 代码 #include <iostream> #include <opencv2/stitching.hpp> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.h…

机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)

目录 一、ROC曲线 二、TP、FP、TN、FN 三、 python绘制ROC曲线(二分类) 1、思路 2、关键代码

easyui datagrid 列拖动

实现代码-code <script type"text/javascript"> $.extend($.fn.datagrid.methods, { columnMoving: function(jq) { return jq.each(function() { var target this; var cells $(this).datagrid(getPanel).find(div.datagrid-header td[field]); cells.dragg…