3

リンク名とリンクURLを含む次のメイン文字列があります。名前とURLは。と組み合わされ#;ます。各リンクの文字列(名前とURL ie)を取得したいのですが、My web#?http://www.google.com以下の例を参照してください

string teststring = "My web#;http://www.google.com My Web2#;http://www.bing.se Handbooks#;http://www.books.se/";

そして、任意の文字列関数を使用して3つの異なる文字列を取得したいと思います。

  • 私のウェブ#?http://www.google.com
  • 私のWeb2#?http://www.bing.se
  • ハンドブック#?http://www.books.de
4

3 に答える 3

4

#;したがって、これは、それ自体で分割するのではなく、後のスペースで分割したいように見えます#;。C#は任意の長さの後ろ姿を提供します。これにより、非常に簡単になります。実際、おそらく最初#;に次のように置き換える必要があります。#?

string teststring = "My web#;http://www.google.com My Web2#;http://www.bing.se Handbooks#;http://www.books.se/";
teststring = Regex.Replace(teststring, @"#;", "#?");
string[] substrings = Regex.Split(teststring, @"(?<=#\?\S*)\s+");

それでおしまい:

foreach(var s in substrings)
    Console.WriteLine(s);

Output:
My web#?http://www.google.com
My Web2#?http://www.bing.se
Handbooks#?http://www.books.se/

#?入力に分割したくない他のものがすでに含まれている可能性がある場合は、もちろん、最初に分割を実行してから(#;パターンで使用)、ループオーバーsubstringsしてループ内で置換呼び出しを実行できます。

于 2012-12-12T23:25:47.680 に答える
1

これらが定数文字列の場合は、を使用できますString.Substring。これは、正しいパラメータを提供するために、厄介な文字を数える必要がありますが、それは機能します。

string string1 = teststring.Substring(0, 26).Replace(";","?");

そうでなければ、物事は複雑になります。サイト名にスペースが含まれている場合を除いて、区切り文字として「」を使用して分割を行うことができます。データ内のサブストリングのいずれかに、ドメインの末尾(つまり、最初に.com、次に.deなど)などの一定の機能がありますか?

于 2012-12-12T23:24:41.460 に答える
1

入力形式を制御できる場合は、たとえば、スペース以外の項目間に別の区切り文字を使用して、解析しやすいように変更することをお勧めします。

この形式を変更できない場合は、コードの分割を実装してみませんか?正規表現を使用するほど短くはありませんが、ロジックが単純なので、読者にとっては実際には理解しやすいかもしれません。

これは、メモリ使用量の点でほぼ間違いなく高速で安価になります。

これを解決するコードの例は次のとおりです。

static void Main(string[] args)
{
    var testString = "My web#;http://www.google.com My Web2#;http://www.bing.se Handbooks#;http://www.books.se/";

    foreach(var x in SplitAndFormatUrls(testString))
    {
        Console.WriteLine(x);
    }
}

private static IEnumerable<string> SplitAndFormatUrls(string input)
{
    var length = input.Length;
    var last = 0;
    var seenSeparator = false;
    var previousChar = ' ';

    for (var index = 0; index < length; index++)
    {
        var currentChar = input[index];

        if ((currentChar == ' ' || index == length - 1) && seenSeparator)
        {
            var currentUrl = input.Substring(last, index - last);
            yield return currentUrl.Replace("#;", "#?");

            last = index + 1;
            seenSeparator = false;
            previousChar = ' ';
            continue;
        }

        if (currentChar == ';' && previousChar == '#')
        {
            seenSeparator = true;
        }

        previousChar = currentChar;
    }
}
于 2012-12-13T00:10:54.820 に答える