2017-09-13 111 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