C# Regex.Replace(字符串,MatchEvaluator)未按预期工作

C# Regex.Replace(字符串,MatchEvaluator)未按预期工作,c#,regex,C#,Regex,我有以下字符串: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")] 我需要将其修改为如下所示: [global::System.CodeDom.Compiler.GeneratedCodeAttribute("myClass", "myVersion")] 显然,实现这一点的最简单方法是使用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)
重载是否可以实现这一点?

您的正则表达式不匹配,因为您编写了
[?:global::|]
,这是一个包含字符?、:、g、l、o、b、a、:、和|的字符范围。您的意思可能是
(?:global::|)
,与
(?:global::)?
相同,即“global::or nothing”

还要注意的是,通过不转义点,它们将匹配任何东西,而不仅仅是文字点。尽管这不太可能引起问题

如果您解决了这个问题,它会起作用,但不会完全如您所愿,因为Regex.Replace会替换整个匹配项,而不仅仅是捕获组中的部分。

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

正确的正则表达式应该是(注意,不是逃避):


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

我这样做的方法是看一看后面的
@(?建议;为了保持理智,请将正则表达式(用C#写)作为逐字字符串文本:@“some\n?regex”当您在正则表达式中嵌入双引号时,@不再是您的朋友。偶尔”“比常量友好得多\-如果它变得复杂,就把它放在一个静态文本块中(也许是resx)-这样就不会满足于。哦,从来没有想过这样做!感谢你让我的生活变得更轻松!只需使用\x22和\x27而不是”和“这与我想要的答案最接近,谢谢你选择了”全局::“错误。这不是我第一次感到困惑(而且我相信这不会是最后一次……你在
[\\s+]
中犯了同样的错误——如果是这样,你应该去掉括号。我更喜欢Expresso()-可脱机使用,特定于C#并生成正则表达式代码,您可以直接将其粘贴到应用程序中。对不起,应该是文字:@”(?
\[(global::)?System\.CodeDom\.Compiler\.GeneratedCodeAttribute\("([^"]+)", "([^"]+)"\)\]
"(?<=\[global::System\.CodeDom\.Compiler\.GeneratedCodeAttribute\()([^\)]*)(?=\)\])"