1

次のタイプの文字列形式があります ---

Proposal is given to {Jwala Vora#3/13} for {Amazon Vally#2/11} {1#3/75} by {MdOffice employee#1/1}

文字列には、位置が異なる{ }のペアが含まれており、n 回になる場合があります。今、そのペアを他の文字列に置き換えたいと思います。これは、 { }ペアの間の文字列に応じて計算します。

これを行う方法 ?

4

4 に答える 4

1

正規表現を試すことができます。具体的には、Regex.Replaceバリアントを使用MatchEvaluatorするとうまくいくはずです。詳細については、 http://msdn.microsoft.com/en-US/library/cft8645c (v=vs.80).aspx を参照してください。

これらの行に沿ったもの:

using System;
using System.Text.RegularExpressions;

public class Replacer
{
    public string Replace(string input)
    {
        // The regular expression passed as the second argument to the Replace method
        // matches strings in the format "{value0#value1/value2}", i.e. three strings
        // separated by "#" and "/" all surrounded by braces.
        var result = Regex.Replace(
            input,
            @"{(?<value0>[^#]+)#(?<value1>[^/]+)/(?<value2>[^}]+)}",
            ReplaceMatchEvaluator);
        return result;
    }

    private string ReplaceMatchEvaluator(Match m)
    {
        // m.Value contains the matched string including the braces.
        // This method is invoked once per matching portion of the input string.
        // We can then extract each of the named groups in order to access the
        // substrings of each matching portion as follows:
        var value0 = m.Groups["value0"].Value; // Contains first value, e.g. "Jwala Vora"
        var value1 = m.Groups["value1"].Value; // Contains second value, e.g. "3"
        var value2 = m.Groups["value2"].Value; // Contains third value, e.g. "13"

        // Here we can do things like convert value1 and value2 to integers...
        var intValue1 = Int32.Parse(value1);
        var intValue2 = Int32.Parse(value2);

        // etc.

        // Here we return the value with which the matching portion is replaced.
        // This would be some function of value0, value1 and value2 as well as
        // any other data in the Replacer class.
        return "xyz";
    }
}

public static class Program
{
    public static void Main(string[] args)
    {
        var replacer = new Replacer();
        var result = replacer.Replace("Proposal is given to {Jwala Vora#3/13} for {Amazon Vally#2/11} {1#3/75} by {MdOffice employee#1/1}");
        Console.WriteLine(result);
    }
}

このプログラムは を出力しますProposal is given to xyz for xyz xyz by xyz

ReplaceMatchEvaluator処理するメソッドでvalue0、必要に応じてアプリ固有のロジックを提供する必要がありvalue1ますvalue2。クラスReplacerには、 で置換ロジックを実装するために使用できる追加のメンバーを含めることができますReplaceMatchEvaluator。文字列は、クラスReplaceのインスタンスを呼び出すことによって処理されます。Replacer

于 2013-02-08T07:32:05.803 に答える
0

文字列を '{' と '}' で分割して、その内容を判断することができます。

しかし、より良い方法は、インデックスで文字を見つけて、ペアまたは中括弧の開始インデックスと終了インデックスを知っているので、プレースホルダーを置き換えて文字列を再構築できると思います。

しかし、最良の方法は Regex.Replace を使用することかもしれませんが、それはプレースホルダーを必要な値に置き換えるのに役立つだけですが、中括弧内のテキストも解析し、それに基づいて挿入する値を選択する必要があると思いますこれはおそらくうまくいきません。文字列の一部を検索してワイルドカード タイプの検索で置換する

于 2013-02-08T07:31:47.313 に答える
0

Regex.Replace Method (String, String, MatchEvaluator)メソッドと{.*?}パターンを使用できます。次の例では、ディクショナリを使用して値を置き換えていますが、これを独自のロジックに置き換えることができます。

class Program
{
    static Dictionary<string, string> _dict = new Dictionary<string, string>();

    static void Main(string[] args)
    {
        _dict.Add("{Jwala Vora#3/13}","someValue1");
        _dict.Add("{Amazon Vally#2/11}", "someValue2");
        _dict.Add("{1#3/75}", "someValue3");
        _dict.Add("{MdOffice employee#1/1}", "someValue4");

        var input = @"Proposal is given to {Jwala Vora#3/13} for {Amazon Vally#2/11} {1#3/75} by {MdOffice employee#1/1}";

        var result = Regex.Replace(input, @"{.*?}", Evaluate);

        Console.WriteLine(result);
    }

    private static string Evaluate(Match match)
    {
        return _dict[match.Value];
    }
}
于 2013-02-08T07:42:04.180 に答える
-1

Cannot you do something with string.Format()?

For example

string.Format("Proposal is given to {0} for {1} {2} by {3}", "Jwala Vora", "Amazon Vally", 1, "MdOffice employee");
于 2013-02-08T07:35:16.333 に答える