web-dev-qa-db-ja.com

文字の最後の出現によって文字列を分割する最良の方法は?

このように文字列を分割する必要があるとしましょう:

入力文字列:「My。name。is Bond._James Bond!」出力2文字列:

  1. 「私の名前はボンドです」
  2. "_ジェームズ・ボンド!"

私はこれを試しました:

int lastDotIndex = inputString.LastIndexOf(".", System.StringComparison.Ordinal);
string firstPart = inputString.Remove(lastDotIndex);
string secondPart= inputString.Substring(lastDotIndex + 1, inputString.Length - firstPart.Length - 1);

誰かがよりエレガントな方法を提案できますか?

43
user2706838
string s = "My. name. is Bond._James Bond!";
int idx = s.LastIndexOf('.');

if (idx != -1)
{
    Console.WriteLine(s.Substring(0, idx)); // "My. name. is Bond"
    Console.WriteLine(s.Substring(idx + 1)); // "_James Bond!"
}
109
Phil K

少しのLINQも使用できます。最初の部分は少し冗長ですが、最後の部分はかなり簡潔です:

string input = "My. name. is Bond._James Bond!";

string[] split = input.Split('.');
string firstPart = string.Join(".", split.Take(split.Length - 1)); //My. name. is Bond
string lastPart = split.Last(); //_James Bond!
12
string[] theSplit = inputString.Split('_'); // split at underscore
string firstPart = theSplit[0]; // get the first part
string secondPart = "_" + theSplit[1]; // get the second part and concatenate the underscore to at the front

編集:コメントから続く;これは、入力文字列にアンダースコア文字のインスタンスが1つある場合にのみ機能します。

9
rex
  1. 2番目以降の分割文字列にのみ分割文字を表示したい場合...
  2. 重複する分割文字を無視したい場合...
  3. もっと中括弧...チェック...
  4. もっとエレガント...たぶん...
  5. もっと楽しい...そうそう!!

    var s = "My. name. is Bond._James Bond!";
    var firstSplit = true;
    var splitChar = '_';
    var splitStrings = s.Split(new[] { splitChar }, StringSplitOptions.RemoveEmptyEntries)
        .Select(x =>
        {
            if (!firstSplit)
            {
                return splitChar + x;
            }
            firstSplit = false;
            return x;
        });
    
3
Kevin