Лучший способ разделить строку на последнее появление символа?

Скажем, мне нужно разбить строку следующим образом:

Строка ввода: "My. Name. 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);

Может ли кто-нибудь предложить более элегантный способ?

Ответ 1

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!"
}

Ответ 2

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

EDIT: после комментариев; это работает только в том случае, если у вас есть один символ подчеркивания в вашей строке ввода.

Ответ 3

Вы также можете использовать 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!

Ответ 4

  1. Предполагая, что вы хотите, чтобы разделительный символ появлялся на второй и более большой строки разделения...
  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;
        });