web-dev-qa-db-fra.com

La meilleure façon de diviser la chaîne par la dernière occurrence du caractère?

Disons que je dois diviser la chaîne comme ceci:

Chaîne d'entrée: "Mon. Nom. Est Bond._James Bond!" Sortie 2 chaînes:

  1. "Mon. Nom. Est Bond"
  2. "_James Bond!"

J'ai essayé ceci:

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

Quelqu'un peut-il proposer une manière plus élégante?

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

Vous pouvez également utiliser un peu de LINQ. La première partie est un peu verbeuse, mais la dernière partie est assez concise:

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
Pierre-Luc Pineault
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: Suite aux commentaires; cela ne fonctionne que si vous avez une instance du caractère de soulignement dans votre chaîne d'entrée.

9
rex
  1. En supposant que vous souhaitez uniquement que le caractère fractionné apparaisse sur la deuxième et la plus grande chaîne fractionnée ...
  2. En supposant que vous souhaitez ignorer les caractères fractionnés en double ...
  3. Plus d'accolades ... vérifiez ...
  4. Plus élégant ... peut-être ...
  5. Plus amusant ... Zut ouais !!

    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