2014-02-12 4 views
24

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

Строка ввода: «Мое имя - это Bond._James Bond!» Выход 2 строки:

  1. ". Меня зовут Бонд"
  2. "! _James Бонд"

Я попытался это:

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

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

+0

Я бы сказал, что подчеркивание именно там для вас, чтобы разделить на. Разделите этот символ и, возможно, добавьте его вручную, если вам действительно нужна его для второй части вывода. –

+0

Непонятно, как вы относитесь к подчеркиванию. Он всегда присутствует? Должно быть удалено с выхода, вам нужно сохранить его? – Steve

ответ

69
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!" 
} 
+1

бонус - это не взорвется, если 'idx == -1', т.е. нет ''.'' –

+0

@CADbloke Huh? Я верю! –

+0

, если он не находит "." то idx == -1, вы добавляете одну (последнюю строку), которая равна нулю, начало строки (https://msdn.microsoft.com/en-us/library/aka44szs(v=vs.110).aspx). Он вернет целую строку, если ее нет. –

8
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: после комментариев; это работает только в том случае, если у вас есть один символ подчеркивания в вашей строке ввода.

+7

Стоит отметить --- Это работает правильно, только если строка имеет одно вхождение буквы. Что это верно в примере, это может быть неверно, когда OP использует это в реальной практике. –

+0

@drew_w Вы правы. – rex

+0

Просто укажите количество разделов типа 'string [] theSplit = inputString.Split (новый char [] {'_'}, 2);' –

7

Вы также можете использовать 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! 
2
  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; 
        }); 
    
Смежные вопросы