我有以下字符串:
[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)
重载实现此目的?
答案 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/测试正则表达式,然后在代码中实现它们。省去了很多麻烦。