正規表示式 「雙向最小匹配」

2021-07-05 15:13:04 字數 1510 閱讀 1400

最近做乙個 字串查詢的例子從字串中提取制定內容

如下:

string input = " 外観図面";
需要提取   "authentication.html?file=kf619l_z.pdf"

** 如下:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.text.regularexpressions;

using system.threading.tasks;

namespace regdemo

public static string getcenterstring(string input,string left,string right)

return ""; }}

}

中間加了 ?  目的是  非貪婪匹配。

但是效果並不理想,效果如下:

按照最小匹配原則,原則上我們應該得到理想結果,但是卻沒有。

這是因為在正則的直譯器中,對於最小匹配原則的理解為正向最小匹配,

而不是雙向最小匹配。

左側匹配後 定住左側邊界   直到找到右側為止

我們換個思路:

中間包含在我們左側的字元即可,

我們對**進行改進:

match match = regex.match(input, left + "(((?!" + left + ").)+?)" + right);
得到了我們想要的結果:

補充:

【零寬斷言】

正則表達四一些字元可以匹配一句話的開始、結束(^ $)或者匹配乙個單詞的開始、結束(\b)。這些元字元只匹配乙個位置,指定這個位置滿足一定的條件,而不是匹配某些字元,因此,它們被成為 零寬斷言

。所謂零寬,指的是它們不與任何字元相匹配,而匹配乙個位置;所謂斷言,指的是乙個判斷。正規表示式中只有當斷言為真時才會繼續進行匹配。

在有些時候,我們精確的匹配乙個位置,而不僅僅是句子或者單詞,這就需要我們自己寫出斷言來進行匹配。下面是斷言的語法:

斷言語法

說明

(?=pattern)

前向肯定斷言,匹配pattern前面的位置

(?!pattern)

前向否定斷言,匹配後面不是pattern的位置

(?<=pattern)

後向肯定斷言,匹配pattern後面的位置 (?

後向否定斷言,匹配前面不是pattern的位置

更多參考:

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...