【问题标题】:C# RegEx - Replace Match Groups?C# RegEx - 替换匹配组?
【发布时间】: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一样简单

标签: c# .net regex


【解决方案1】:

我用谷歌搜索了一下,发现了一些有趣的东西here

我稍微调整了他们的解决方案,使其符合标准。它似乎工作得很好。虽然我不确定它是否比删除插入方法更好。

这是我的代码:

var name = "Blah";
var location = "..\\Core\\Libraries\\Blah\\Blah.csproj";
var result = Regex.Replace(INPUT, "^(.*\")(\\w+)(\".*\")([\\w\\\\\\.]+)(\".*)$", m =>
    {
        return string.Join("",
                m.Groups.OfType<Group>().Select((g, i) =>
                {
                    switch (i)
                    {
                        case 1:
                            return g.Value;
                        case 2:
                            return name;
                        case 3:
                            return g.Value;
                        case 4:
                            return location;
                        default:
                            return g.Value;
                    }
                }).Skip(1).ToArray());
    });

这是ideone上的完整代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多