【发布时间】:2020-09-01 14:15:05
【问题描述】:
找不到干净的方法来做到这一点 - 只想替换两个匹配的字符串 - 但是每个示例都非常hacky(使用子字符串根据匹配来拆分字符串??),没有干净的方法来只需替换字符串中的两个匹配组??谢谢
var inLine = "Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Common\", \"Libraries\\Common\\Common.csproj\", \"{91197577-34B9-4D46-B3FE-A8589D4380B1}\"";
var regex = new Regex("Project\\(\\\"{.*}\\\"\\) = \"(?<projectName>\\S*)\", \"(?<relativePath>\\S*)\", \"{.*}\"");
var newProjectName = "Blah";
var newRelativePath = "..\Core\Libraries\Blah\Blah.csproj";
var match = regex.Match(inLine);
if (match.Success)
{
var projectName = match.Groups[1].Value;
var relativePath = match.Groups[2].Value;
var replaced = regex.Replace(inLine, m =>
{
// ??????????
return "";
});
// want replaced to be:
// Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blah", "..\Core\Libraries\Blah\Blah.csproj", "{91197577-34B9-4D46-B3FE-A8589D4380B1}"
}
已编辑帖子:预期行为是输入字符串:
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Libraries\Common\Common.csproj", "{91197577-34B9-4D46-B3FE-A8589D4380B1}"
想要将 Common 和 Libraries\Common\Common.csproj 替换为 Blah 和 ..\Core\Libraries\Blah\Blah.csproj 等 2 个其他字符串,因此新字符串值(已替换)为:
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Blah", "..\Core\Libraries\Blah\Blah.csproj", "{91197577-34B9-4D46-B3FE-A8589D4380B1 }"
【问题讨论】:
-
为正则表达式的每个部分添加一个组名。因此,您可以使用链接 docs.microsoft.com/en-us/dotnet/standard/base-types/… 中的命名匹配子表达式
-
为了按您的需要回答您的问题,请说明您最终需要得到什么?带有项目名称的
projectName变量,带有相对路径的relativePath以及replaced应该是什么样的? -
我认为你需要替换原始字符串中的某些内容,还要初始化几个变量,请参阅ideone.com/zo9HUs
-
@jdweng 谢谢 - 我已经将组名添加到每个部分(请参阅 ?
和 ? )并且我看到了那个 msdn 文档,但不清楚如何实际替换这些匹配项在原始字符串中带有其他内容。用我想要的更新原始帖子。谢谢。 -
那听起来就像ideone.com/PHJeQL一样简单