2014-02-12 7 views
24

Angenommen, ich muss die Zeichenfolge wie folgt teilen:Der beste Weg, um die Zeichenfolge nach dem letzten Vorkommen von Zeichen zu teilen?

Eingabezeichenfolge: "Mein Name ist Bond._James Bond!" Ausgang 2 Strings:

  1. ". Mein Name ist Bond"
  2. "! _James Bond"

Ich versuchte dies:

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

jemand eleganteren Weg schlagen kann?

+0

Ich würde sagen, dass Strich genau gibt es für Sie zu teilen. Teilen Sie das Symbol und fügen Sie es eventuell manuell hinzu, wenn Sie es wirklich für den zweiten Teil der Ausgabe brauchen. –

+0

Nicht klar, wie Sie den Unterstrich behandeln möchten. Es ist immer da? Sollte die Ausgabe entfernt werden, müssen Sie sie behalten? – Steve

Antwort

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

Bonus - dies explodiert nicht, wenn 'idx == -1', dh Es gibt kein '.'' –

+0

@CADbloke Huh? Ich glaube es tut es! –

+0

wenn es nicht "." dann idx == -1, fügen Sie eine (letzte Zeile) hinzu, das ist Null, der Anfang der Zeichenfolge (https://msdn.microsoft.com/en-us/library/aka44szs(v=vs.110).aspx)). Es wird die ganze Zeichenfolge zurückgeben, wenn nicht "." –

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: Nach den Kommentaren; das funktioniert nur, wenn Sie eine Instanz des Unterstrichs in Ihrer Eingabezeichenfolge haben.

+7

Bemerkenswert --- Dies funktioniert nur korrekt, wenn die Zeichenfolge nur einmal vorkommt. Was im Beispiel zutrifft, trifft möglicherweise nicht zu, wenn das OP dies in der Praxis verwendet. –

+0

@drew_w Sie haben Recht. – rex

+0

Geben Sie einfach Anzahl der Splits wie 'string [] theSplit = inputString.Split (new char [] {'_'}, 2);' –

7

Sie können auch ein wenig LINQ verwenden. Der erste Teil ist ein wenig ausführlich, aber der letzte Teil ist ziemlich prägnant:

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. Unter der Annahme, nur Sie die Split-Charakter auf dem zweiten und größeren geteilten Streichern erscheinen soll ...
  2. Angenommen, Sie möchten doppelte Spaltung Zeichen ...
  3. Mehr geschweiften Klammern zu ignorieren ... überprüfen ...
  4. Mehr elegant ... vielleicht ...
  5. Mehr Spaß ... Heck yeah !!

    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; 
        }); 
    
Verwandte Themen