我环顾四周试图找到这个问题的答案,但我无法找到我正在寻找的答案。似乎应该有一种方法来决定是否有匹配和替换,否则做其他事情而不需要重复匹配。
我试图确定测试字符串是否包含以
结尾的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使其运行两次。而且,我可能会过度思考这个问题,或者过早地进行优化。你怎么看?
答案 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
,以防止在结束标记和结束前插入文本。希望有所帮助:)