2017-09-13 110 views
1

我環顧四周試圖找到這個問題的答案,但我找不到我正在尋找什麼。似乎應該有一種方法來決定是否有匹配和替換,否則做一些其他的事情,而不需要重複匹配。正則表達式匹配,然後替換

我想,以決定是否將測試字符串包含在

</body></html> 

結束,正前方的標籤注入一些文本的HTML文檔。當然,這兩個標籤之間可能會有空白/回車符/換行符的組合,因此我正在使用正則表達式。但是,測試字符串可能只是純文本,如果正則表達式匹配失敗,我只會將文本追加到字符串的末尾。當然,我可能會讓事情變得更加困難。

我真的沒有任何代碼顯示在這裏,因爲我想不通,如果這是可能的.NET正則表達式實現,但在這裏表示我願意做一些psudo代碼:

 Dim testString As String = some file contents 
     Dim reg As New Regex("(<\/body>\s*<\/html>)", RegexOptions.IgnoreCase) 
     Dim rMatch As Match = reg.Match(testString) 
     If rMatch.Success Then 
      rMatch.Replace(newString) 
     Else 
      testString &= alternateNewString 
     End If 

當然,我需要將end body和end html標籤放入newString以正確關閉文檔,但這應該不成問題。我似乎無法實現的部分是匹配替換,而無需再次運行正則表達式。這似乎是調用match來確定它是否匹配,然後調用replace使它運行兩次。再次,我可能會過度考慮這一點,或者過早地進行優化。你怎麼看?

回答

1

如果我理解正確的話,你試圖做這樣的事情(這是不太好,見下文)

Dim testString As String = "Your original string" 
Dim newStr As String = String.Empty 
Dim textToInsert As String = "Your text to 'inject'" 

Dim reg As New Regex("<\/body>\s*<\/html>", RegexOptions.IgnoreCase) 
newStr = reg.Replace(testString, textToInsert & Environment.NewLine & "</body></html>") 
If newStr = testString Then 
    newStr = testString & Environment.NewLine & textToInsert 
End If 

,將工作,但相匹配兩次,在性能方面不會更好。

所以,更好的選擇是居然讓正則表達式做所有的工作適合你(即匹配/更換要麼結束標記字符串的結尾)。在這種情況下,你可以改變你的模式,看起來像這樣:\s*(<\/body>\s*<\/html>)|$

注:

  • |$基本上意味着「或字符串的末尾」
  • 您的原始圖案放入捕獲組()中,以便您在更換後可以訪問它。

使用這種方式,你的代碼看起來像下面這樣:

Dim testString As String = "Your original string" 
Dim newStr As String = String.Empty 
Dim textToInsert As String = "Your text to 'inject'" 

Dim reg As New Regex("\s*(<\/body>\s*<\/html>)|$", RegexOptions.IgnoreCase) 
newStr = reg.Replace(testString, Environment.NewLine & textToInsert & 
        Environment.NewLine & "$1", 1) 

其中:

  • $1表示第一組,這基本上是</body></html>任何數字之間的空白字符。
  • Replace函數中的最後一個參數是應該替換的匹配字符串的最大數目。它被設置爲1,以防止在字符串末尾的結束標記之前插入文本。

希望幫助:)

+0

我的正則表達式技能缺乏,但它開始變得有意義。感謝您花時間整理這個回覆。看起來正是我需要的! – Wayne