1

我在使用 regex.Replace 替换部分字符串时遇到问题。基本思想是我想捕获字符串的开头,然后用代码中的值替换字符串的结尾。例如,假设我有一个字符串,上面写着“测试编号”,后跟数字,我想增加该数字。我捕获了“测试编号”,但是当我尝试将该捕获与新编号连接时,它会将捕获 ($1) 视为文字并用 $1[新编号] 替换整个字符串。

Dim s as String = "We are on Test Number 1"
Dim newNumber as Integer = 2

s=Regex.Replace(s,"(Test Number )(\d)","$1" & newNumber)

这将输出“We are on $12”。但是,如果我在替换中使用文字,则不会发生此问题。

Dim s as String = "We are on Test Number 1"

s=Regex.Replace(s,"(Test Number )(\d)","$1" & "2")

正如预期的那样,这将输出“We are on Test Number 2”。

是否有人对在包含捕获的组时如何在 Regex.Replace 的替换字符串部分中使用变量有任何想法?

提前致谢。

4

2 回答 2

3

我刚遇到同样的问题。要修复它,请转义花括号中的组号。

s=Regex.Replace(s,"(Test Number )(\d)","${1}" & newNumber)

这是一个有效的 dotnetfiddle 示例:https ://dotnetfiddle.net/1gZKNB

于 2015-02-27T20:04:34.227 回答
1
Dim s as String = "We are on Test Number 1"
Dim newNumber as Integer = 2

s=Regex.Replace(s,"(Test Number) (\d)","$1 " & newNumber)

问题是当你连接时,你最终指定了“$12”,当然没有捕获12。在这种情况下,我们可以从“测试号”中取出尾随空格并将其添加到替换中,所以我们的替换string 是 "$1 2" 并且捕获替换按需要工作。

一个更好、更通用的解决方案(也可以在没有空格时使用)是使用Regex.Replace接受 a 的重载MatchEvaluator

s = Regex.Replace(s, "(Test Number )(\d)",
   New MatchEvaluator(Function(m as Match)(m.Groups(1).Value & newNumber)))
于 2012-04-05T16:53:29.753 回答