7

私はこの文字列を持っています:

「B82V16814133260」

そこから 2 つの文字列を取得する最も効率的な方法は次のとおりです。

左部分文字列:「B82V」 右部分文字列:「16814133260」

ルールは次のとおりです。右側のすべての数字を取り出して文字列を作成し、リマインダーを取り出して別の文字列に配置します。

これが私の解決策ですが、かさばりすぎます。短く効率的に行うには?

        String leftString = "";
        String rightString="";

        foreach (char A in textBox13.Text.Reverse())
        {
            if (Char.IsNumber(A))
            {
                rightString += A;
            }
            else
            {
                break;
            }
        }

        char[] arr = rightString.ToArray();
        Array.Reverse(arr);

        rightString=new string(arr);
        leftString = textBox13.Text.Replace(rightString, "");
4

6 に答える 6

14

これにより、期待どおりの結果が得られます。

var given = "B82V16814133260";
var first = given.TrimEnd("0123456789".ToCharArray());
var rest = given.Substring(first.Length);

Console.Write("{0} -> {1} -- {2}", given, first, rest);
//  B82V16814133260 -> B82V -- 16814133260
于 2012-03-28T18:59:03.193 に答える
5

まあ、おそらく他の答えの方が良いでしょうが、とにかくこれを書いたので、投稿します:

ニーズ:

using System.Text.RegularExpressions;

コード:

string str = "B82V16814133260";
string[] match = Regex.match(str, @"^([\d\w]+?\w)(\d+)$").Groups;
string left = match[1];
string right = match[2];
于 2012-03-28T19:07:01.957 に答える
3

これは非常に高速です。

int index = text.Length - 1;
while (index >= 0 && Char.IsDigit(text[index]))
{
    index--;
}
string left = text.Substring(0, index + 1);
string right = text.Substring(index + 1);
于 2012-03-28T19:01:03.023 に答える
2

「最も効率的」を「最速」と読みます。

長い文字列を使って 1000 万回実行する簡単なテストを作成しました。

使用するオースティンのソリューションTrimEndは 4.649 秒で実行されました

私のソリューションは 1.927 秒で実行されました

    int j = given.Length - 1;

    for (; j >= 0; j--)
    {
      char c = given[j];
      if (c < '0' || c > '9')
      {
        break;
      }
    }

    var first = given.Substring(0, j + 1);
    var rest = given.Substring(j + 1);

私のビルドはデバッグされていないことに注意してください (デバッグでは、私のソリューションは遅くなりますが、それは TrimEnd がデバッグ ビットで実行されていないためです)。したがって、アプリケーションで私のコードを実行していて、デバッグをビルドしている場合は、遅くなります。

于 2012-03-28T19:47:58.570 に答える
1

リンクが好きです。

    var s = "B82V16814133260";
    var lastNonNumeric = s.Reverse().Where(x => !char.IsDigit(x)).FirstOrDefault();
    var index = s.LastIndexOf(lastNonNumeric);
    var secondString = s.Substring(index + 1);
    var firstString = s.Substring(0, index+1);

おそらく最善または最も堅牢なソリューションではありませんが、テスト文字列では機能します。

于 2012-03-28T19:02:35.123 に答える
0
 string Source = textBox13.Text;

 for (i = Source.Length - 1; i >=0; i--)
 {
      if (! Char.IsNumber(Source[i])
         break;
 }

 string leftString = Source.Left(i+1);
 string rightString = Source.Right(i+1,Source.Length-i-1);
于 2012-03-28T19:15:59.617 に答える