正則表達式匹配不包含特定字符串解決匹配溢出問題

匹配溢出問題在正則表達式當中算是比較常見的問題,它常常導致我們匹配結果莫名其妙的出錯,本文專門為你講解如何通過匹配不包含特定字符串的方法來解決這類問題。

那么,什么是匹配溢出呢?
下面我們來看個例子:

源文本:<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.pswp.cn/news/256393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256393.shtml
英文地址,請注明出處:http://en.pswp.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…