2

私は初心者のプログラマーなので、あまりにも明白な質問をしている場合は、事前に申し訳ありません.

私はc#(WPF)でプログラミングしています。

この構造に組み込まれている文字列がいくつかあります。

string str ="David went to Location 1 to have lunch";
string str2 ="Mike has to walk a mile facing north to reach Location 2";

最もエレガントな方法で "Location 1" を切り取って別の文字列に置き換えるにはどうすればよいですか (この例を続けるには、おそらくレストランの名前を保持します)??

私は次のようなことを考えました:

str.replace("Location 1", strRestaurantName);

しかし、それは一般的でなければならないので(すべての場所xの置換を可能にするため)str.indexof、数字の位置を取得するために使用するものでなければなりません(1から20までの数値にすることができます)、私だけがそれを機能させることができません.. .

残念ながら、私の上司は私が正規表現を使用することを望んでいません。

前もって感謝します。

4

4 に答える 4

1

フォーマットを使用するのはどうですか?このような何かがうまくいくはずです:

string locationString = "some string";
string.Format("David went to {0} to have lunch", locationString);

これにより、次の文が生成されます。David went to some string to have lunch

もちろん、必要な数の文字列を追加できます。また、同じ変数番号を何度も使用して同じ文字列を複製することもできます (たとえば、これは場所に挿入されるのはDavid went to {0} and {0} to have lunch1 つだけです。string{0}

于 2013-05-20T06:00:31.630 に答える
0

他の人が言ったように、ここでは正規表現が本当に正しい解決策ですが、基本的に正規表現が内部で行うことを行うことができます。

注: このコードはテストもコンパイルもしていません。これは一致するはずLocation (\d+)です。

string ReplaceLocation(string input, IList<string> replacements)
{
    string locString = "Location ";
    int matchDigitStart = 0;
    int matchDigitEnd = 0;
    int matchStart = 0;

    do{
        matchStart = input.IndexOf(locString, matchDigitStart);
        if(matchStart == -1)
        {
            throw new ArgumentException("Input string did not contain Location identifier", "input");
        }

        matchDigitStart = matchStart + locString.Length;
        matchDigitEnd = matchDigitStart;
        while(matchDigitEnd < input.Length && Char.IsDigit(input[matchDigitEnd]))
        {
            ++matchDigitEnd;
        }

    } while (matchDigitEnd == matchDigitStart);


    int locationId = int.Parse(input.Substring(matchDigitStart, matchDigitEnd - matchDigitStart));
    if(locationId > replacements.Count || locationId == 0 )
    {
        throw new ArgumentException("Input string specified an out-of-range location identifier", "input");
    }

    return input.Substring(0, matchStart) + replacements[locationId - 1] + input.Substring(matchDigitEnd);
}
于 2013-05-20T07:55:33.743 に答える
0

あなたは正しい軌道に乗っています。考えている:

1) リスト内の「場所 1 = このレストラン」、「場所 2 = あの場所」などをパラメータ化したい場合:

http://www.dotnetperls.com/list

http://www.dotnetperls.com/split

2) コードは、文字列ごとに各リスト項目を循環します。または、一致するものが見つかるまで循環します。

str.Format("David went to {0} to have lunch", strRestaurantName);3) 可能であれば、独自の "Location N" 構文を発明する代わりに、C# プレースホルダーを使用することをお勧めします。str.Format("David went to {0} to have lunch, then Mike has to walk a mile facing north to reach {1}", strRestaurantName, strHikingLocation);

于 2013-05-20T06:01:04.327 に答える