C# 在正则表达式中不使用任何内容替换所有已命名的捕获组

C# 在正则表达式中不使用任何内容替换所有已命名的捕获组,c#,regex,replace,C#,Regex,Replace,假设我有一个主题: ////////File description//////// Name: SomeFile.cs Size: 234 Description: Foo Date: 08.14.2012 /////////////////////////////// ////////File description//////// Name: Size: Description: Date: /////////////////////////////// var pattern

假设我有一个主题:

////////File description////////
Name: SomeFile.cs
Size: 234
Description: Foo
Date: 08.14.2012
///////////////////////////////
////////File description////////
Name: 
Size: 
Description: 
Date:
///////////////////////////////
var pattern = 
@"(/+File description/+
Name: )(?<name>.+)(
Size: )(?<size>.+)(
Description: )(?<des>.+)(
Date: )(?<date>.+)(
/+)";

// subject = fist code at top of this questoin

var temp = Regex.Replace(subject,pattern,"$1$2$3$4$5");
/+File description/+
Name: (?<name>.+)
Size: (?<size>.+)
Description: (?<des>.+)
Date: (?<date>.+)
/+
我怎样才能把这个主题变成:

////////File description////////
Name: SomeFile.cs
Size: 234
Description: Foo
Date: 08.14.2012
///////////////////////////////
////////File description////////
Name: 
Size: 
Description: 
Date:
///////////////////////////////
var pattern = 
@"(/+File description/+
Name: )(?<name>.+)(
Size: )(?<size>.+)(
Description: )(?<des>.+)(
Date: )(?<date>.+)(
/+)";

// subject = fist code at top of this questoin

var temp = Regex.Replace(subject,pattern,"$1$2$3$4$5");
/+File description/+
Name: (?<name>.+)
Size: (?<size>.+)
Description: (?<des>.+)
Date: (?<date>.+)
/+

现在我做以下操作:

////////File description////////
Name: SomeFile.cs
Size: 234
Description: Foo
Date: 08.14.2012
///////////////////////////////
////////File description////////
Name: 
Size: 
Description: 
Date:
///////////////////////////////
var pattern = 
@"(/+File description/+
Name: )(?<name>.+)(
Size: )(?<size>.+)(
Description: )(?<des>.+)(
Date: )(?<date>.+)(
/+)";

// subject = fist code at top of this questoin

var temp = Regex.Replace(subject,pattern,"$1$2$3$4$5");
/+File description/+
Name: (?<name>.+)
Size: (?<size>.+)
Description: (?<des>.+)
Date: (?<date>.+)
/+
var模式=
@“(/+文件说明/+
名称:)(?。+)(
尺寸:)(?。+)(
描述:)(?。+)(
日期:)(?。+)(
/+)";
//主题=此问号顶部的第一个代码
var temp=正则表达式替换(主题、模式,“$1$2$3$4$5”);
图案很乱



现在我的问题是: 我想要图案:

////////File description////////
Name: SomeFile.cs
Size: 234
Description: Foo
Date: 08.14.2012
///////////////////////////////
////////File description////////
Name: 
Size: 
Description: 
Date:
///////////////////////////////
var pattern = 
@"(/+File description/+
Name: )(?<name>.+)(
Size: )(?<size>.+)(
Description: )(?<des>.+)(
Date: )(?<date>.+)(
/+)";

// subject = fist code at top of this questoin

var temp = Regex.Replace(subject,pattern,"$1$2$3$4$5");
/+File description/+
Name: (?<name>.+)
Size: (?<size>.+)
Description: (?<des>.+)
Date: (?<date>.+)
/+
/+文件说明/+
名称:(?。+)
尺寸:(?。+)
说明:(?。+)
日期:(?。+)
/+

我想知道是否可以替换组
名称
大小
。etc没有任何内容

您可以简单地用空描述重写文件,除非同一文件中有多个主题

您可以通过以下方式完成此操作:

string text = "/////////////File description/////////////\nName:\nSize:\nDescription:\nDate:\n//////////////////////////";
System.IO.File.WriteAllText(@"X:\Path\to\your\file.whatever", text);

这可能比您希望的更复杂,但您可以尝试使用MatchEvaluator。MatchEvaluator为每个匹配计算替换字符串。MatchEvaluator可以访问“Match”对象,因此它可以做一些有趣的事情,仅限于您的想象力

        var pattern =
@"/+File description/+ 
Name: (?<name>.+) 
Size: (?<size>.+) 
Description: (?<des>.+) 
Date: (?<date>.+) 
/+";
        var temp = Regex.Replace(data, pattern, new MatchEvaluator(eval));
        Console.WriteLine("{0}", temp);
    //...
    string eval(Match mx)
    {
        Stack<Group> stk = new Stack<Group>();
        for(int i=1; i<mx.Groups.Count; ++i)
            stk.Push(mx.Groups[i]);

        string result = mx.Groups[0].Value;
        int offt = mx.Index;
        while(stk.Count > 0)
        {
            var g = stk.Pop();
            int index = g.Index - offt;
            result = result.Substring(0,index) + result.Substring(index+g.Length);
        }
        return result;
    }

这是因为您正在匹配中替换。也就是说,您的外部匹配缩小了搜索范围,而您的单个替换对象没有机会替换错误的对象。如果您使用这种方法,您的外部模式可能会简单得多,因为不需要组。

您的模式中包含您想要的结果的子集。为什么不只是硬编码,而不是尝试匹配模板呢?对不起。我的解决方案需要一种新的模式。