C# Regex替換制定關鍵詞後面的所有內容

來源:互聯網
上載者:User

標籤:

如題,將 {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)這個函數匹配取得結果後還可以做更詳細的一些分析,那時也會用到分組名的.如果你想忽略掉某個位置的分組資訊就可以顯式的指定分組沒有名字.

 

零寬斷言

 

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

於是出現了零寬斷言這個怪怪的名詞,其實它代表的意思是這樣,零寬表示那個運算式不佔用地方,寬度為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}?

C# Regex替換制定關鍵詞後面的所有內容

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.