0

私が主題を持っているとしましょう:

////////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>.+)
/+

グループを置き換えることができるかどうか疑問に思いましたnamesize。何もないなど

4

2 に答える 2

0

同じファイルに複数のサブジェクトがある場合を除いて、空の説明を使用してファイルを単純に書き換えることができます。

これを行うには、次のようにします。

string text = "/////////////File description/////////////\nName:\nSize:\nDescription:\nDate:\n//////////////////////////";
System.IO.File.WriteAllText(@"X:\Path\to\your\file.whatever", text);
于 2012-07-30T22:16:51.193 に答える
0

これはあなたが望むよりも複雑かもしれませんが、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;
    }

MatchEvaluatorを使用する別のアプローチは次のようになります(パターンまたは私のもので機能するはずです)。

    string eval2(Match mx)
    {
        string data = mx.Value;
        data = Regex.Replace(data, "Name: .+", "Name: ");
        data = Regex.Replace(data, "Size: .+", "Size: ");
        data = Regex.Replace(data, "Description: .+", "Description: ");
        data = Regex.Replace(data, "Date: .+", "Date: ");
        return data;
    }

これは、マッチ内で交換するために機能します。つまり、外側のマッチは検索を絞り込みますが、個々の置換は間違ったものを置換する可能性はありません。このアプローチを使用すると、グループが不要になるため、外側のパターンがはるかに単純になります。

于 2012-07-30T22:55:31.970 に答える