正则表达式匹配然后替换

时间:2017-09-13 21:51:58

标签: regex vb.net

我环顾四周试图找到这个问题的答案,但我无法找到我正在寻找的答案。似乎应该有一种方法来决定是否有匹配和替换,否则做其他事情而不需要重复匹配。

我试图确定测试字符串是否包含以

结尾的HTML文档
</body></html>

并在这些标记之前直接注入一些文本。当然,在2个标签之间可能存在空白/回车/换行的组合,因此我尝试使用Regex。但是,测试字符串可能只是纯文本,如果正则表达式匹配失败,我只会将文本追加到字符串的末尾。当然,我可能比现在更困难。

我真的没有任何代码要显示在这里,因为我无法弄清楚这是否可以通过.NET Regex实现,但是这里有一些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中以正确关闭文档,但这应该没问题。我似乎无法实现的部分是匹配替换而无需再次运行正则表达式。似乎调用匹配来确定它是否匹配,然后调用replace使其运行两次。而且,我可能会过度思考这个问题,或者过早地进行优化。你怎么看?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你会尝试做这样的事情(这不太好,见下文)

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

这样可行,但与匹配两次相比,在性能方面不会更好。

所以,一个更好的选择是实际让正则表达式为你完成所有工作(即匹配/替换 结束标记 OR 字符串的结尾) 。在这种情况下,您可以将模式更改为:\s*(<\/body>\s*<\/html>)|$

注意:

  • |$基本上是指<​​em>“或字符串的结尾”。
  • 您的原始模式已放入捕获组(),以便您在以后更换时可以访问它。

使用这种方式,您的代码将如下所示:

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,以防止在结束标记结束前插入文本。

希望有所帮助:)