C# 正則表達式替換制定關鍵詞后面的所有內容


如題,將 {OUTSCIPTE} 關鍵詞后的所有內容替換為string.Empty(包含關鍵字)
這個正則該怎么寫?
我是 {OUTSCIPTE}(.*)$ 寫的但是什么反應也沒有


string str=Regex.Replace("字符串",@"(?<=\{OUTSCIPTE\})[\s\S]*$","");

 

 

不錯的文章對零寬斷言很好的理解與解釋了

分組

我們在前面有用大括號{}來指定單個字母出現多少次,比如w{3}表示w連續出現三次.那如果是一串字符的話怎么整呢.我們會聯想到算術符號里面的優先級問題,比如乘除號比加減號優先級高.要想使加減號先執行操作可以用個小括號把它們括起來.那在這兒同樣把一串字符括起來就行.

比如(arwen){3}表示字符arwen重復三次. (ab[cde]*){4}表示ab[cde]*重復4次.反正用個()括起來后里面就被當作一個單元,一個整體了.專業點說法就叫分組

另外貌似用$加一個數字可以引用前面的分組.例如

string str = @"123abc";

string str = Regex.Replace(str,@(\d+)\w+, @"$1+456"); \\結果是123+456

(\d+)是匹配了123並把它做為一個組,$1就是引用了這個組

 

后向引用

 

后向引用,這名字聽起來別扭,其實簡單點講就是在后面的匹配中又用到前面的某個分組.那如果在后面某個地方的匹配中要再次用到那個分組咋整呢?簡單點的簡單的做法把那個分組再照寫下就得了唄.

比如(arwen){2}123abc(arwen){3}.但這樣看起來有點冗余,於是就整個偷懶的辦法出來.給每個分組起個名字,直接用組名來表示那個分組.如果你不直接命名會默認按分組從左到右出現的順序命名為1,2,3...比如上面的例子最先出現的(arwen)命名為1,再出現個(arwen)命名為2,假如后面還來個(james)那命名為3

有個分組的名字后,上面的例子可以簡寫為(arwen){2}abc\1{3}引用分組的格式是一個斜杠\加組名

你還可以自己顯式為每個組起個名字,格式是(?<name>exp)或者(?'name'exp)其中name是分組的名字,exp是分組中的內容.?就只是標識符而已.假如我要給分組(arwen)取名為a的話就這樣寫(?<a>arwen)這樣開頭的例子又可以寫為(arwen){2}\a{3}

除了給分組默認取名或顯式取名外還可以不給它取名格式是(?:exp)比如把分組(arwen)改成(?:arwen)就表示這個分組沒名字.你后面不能通過某個名字去引用它.那這樣做有什么意義呢?因為除這在這里我們看到分組名有用外,當通過Regex.Match(string source,string pattern)這個函數匹配取得結果后還可以做更詳細的一些分析,那時也會用到分組名的.如果你想忽略掉某個位置的分組信息就可以顯式的指定分組沒有名字.

 

零寬斷言

 

我們前面的一些簡單匹配,都是先知道要匹配的子字符的一些信息,然后用些元字符和限制字符來表示它.進而匹配出結果.這是直接的匹配方式.還可以通過一些間接的匹配信息,比如知道子字符串前面有啥字符,屁股后面跟着些啥字符來匹配.

於是出現了零寬斷言這個怪怪的名詞,其實它代表的意思是這樣,零寬表示那個表達式不占用地方,寬度為0,比如前面說的^$匹字符串的開頭或結尾.它不占用地方,只表示開頭或結尾這樣一個位置概念.至於斷言嘛是邏輯理論里面的一個說法.簡單的說就是做判斷了,下結論了.

零寬度正預測先行斷言(?=exp)  它表示某個字符串背后跟着字符串exp比如.*(?=fool)表示某個字符以fool結尾.如果有字符you are afool.則匹配到的子字符是you are a

零寬度正回顧后發斷言(?<=exp) 它表示某個字符串前面有字符串exp比如(?<=fuck)表示某個字符串前面有fuck.如果有字符fuck you則匹配的結果是 you

有了有通過前面或后面有某個字符串來判斷,自然就可以有通過前面或后面沒有啥字符來判斷.這也是相反的意思.表示方法也差不多,只是=號變!

零寬度負預測先行斷言 (?!exp) 它表示某個字符串后面沒有跟着exp比如hao(?!\d)表示字符hao后面沒緊跟着數字,如果有字符hao123,則不能匹配.如果是字符hao 123則匹配到hao

零寬度負回顧后發斷言 (?<!exp)它表示某個字符串前面沒有exp比如(?<!\d)hao表示字符串hao前沒有數字.如果有字符123hao則匹配失敗.如果是字符123 hao則匹配到hao

 

其實像啥零度斷言這 類術語太讓人糾結了,你干脆別去管他好了.就直接想象成前面有,后面有,前面沒有,后面沒有這樣的通俗易懂的詞好了

 

貪婪與懶惰

 

我們知道由於匹配的條件往往很模糊,所以匹配到的結果可以是不同的,比如有字符anrwen,用a.*n去匹配.那an和anrwen都是符合條件的結果

一匹配到an就不再匹配下去了,自然是很懶的做法,所以叫懶惰匹配.具體意思就是說盡可能匹配短的字符

而相反的情況就是貪婪匹配,盡可能匹配多的字符

默認的做法是貪婪匹配.所以上面的例子匹配的結果是anrwen

如果我們想得到an的結果,則要這樣寫a.*?n 多加個問號

至於這個?號在什么情況下用呢,自然是有出現讓某個字符重復多次的限定符出現時用

比如* + ? {n}這些符號出現時就可以用,變成*?  +?  {n}?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM