最近做乙個 字串查詢的例子從字串中提取制定內容
如下:
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...