Regex.Replace(string,MatchEvaluator)无法按预期工作

时间:2009-09-15 08:39:21

标签: c# regex

我有以下字符串:

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]

我需要将其改为如下所示:

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("myClass", "myVersion")]

显然,实现这一目标的最简单方法是使用Regex从该字符串中捕获我想要的部分,然后将结果与我的额外文本连接起来。但是,我希望使用Regex.Replace()方法使代码更清晰:

Regex generatedCodeAttributeRegex = new Regex("\\[[?:global::|]System.CodeDom.Compiler.GeneratedCodeAttribute\\((\"System.Data.Design.TypedDataSetGenerator\",[\\s+]\"2.0.0.0\")\\)\\]");

inputFileContent = generatedCodeAttributeRegex.Replace(inputFileContent, delegate(Match m)
{
  return string.Format("\"{0}\", \"{1}\"",
                       this.GetType(),
                       Assembly.GetExecutingAssembly().GetName().Version);
});

根据我的理解,这应该用委托中指定的文本替换捕获的组...问题是它没有。我究竟做错了什么?是否可以通过Regex.Replace(string, string)重载实现此目的?

3 个答案:

答案 0 :(得分:2)

我这样做的方式是在@"(?<=)"后面看一下,并向前看@"(?=)",如下所示:

"(?<=\[global::System\.CodeDom\.Compiler\.GeneratedCodeAttribute\()([^\)]*)(?=\)\])"

然后你的替换字符串应该按原样运行。

答案 1 :(得分:0)

你的正则表达式不匹配,因为你写了[?:global::|],这是一个包含字符?,:,g,l,o,b,a,:和|的字符范围。您可能意味着(?:global::|)(?:global::)?相同,即“全局::或无”。

另请注意,通过不逃避点,它们将匹配任何东西 - 而不仅仅是文字点。虽然这不太可能导致问题。

如果你修复了它,它会起作用,但不是你想要的,因为Regex.Replace会替换整个匹配,而不仅仅是捕获组中的部分。

答案 2 :(得分:0)

不确定C#专业,但我猜测正则表达式是完全错误的。方括号以错误的方式使用。它们只能定义字符类,不能用于捕获子模式。所有这些假设C#使用常规的perl风格的regexp。

正确的正则表达式是(注意,不要转义):

\[(global::)?System\.CodeDom\.Compiler\.GeneratedCodeAttribute\("([^"]+)", "([^"]+)"\)\]

我的建议:首先转到http://regexpal.com/测试正则表达式,然后在代码中实现它们。省去了很多麻烦。

相关问题