1
votes

Comment obtenir les 2 derniers mots (à partir de l'avant-dernier espace) d'une chaîne?

Ma chaîne principale est,

"Lorem Ipsum est le texte factice standard de l'industrie depuis les années 1500 20 TN 123 34"

Je veux obtenir "123 34" uniquement à partir de la chaîne principale. J'ai fait par le code suivant.

  string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
                string filterStr = mainStr.Substring(0, mainStr.LastIndexOf(" "));
                int sRange = filterStr.LastIndexOf(" ");
                string outputStr = mainStr.Substring(sRange+1);

Comment faire par Linq way (juste une seule ligne est génial)?


2 commentaires

Je ne pense pas que LINQ soit particulièrement adapté à cela, car ce n'est pas vraiment une opération basée sur une collection. Personnellement, je préfère la lisibilité.


J'ai pensé, pour éviter une déclaration variable.


5 Réponses :


1
votes

Avec Linq:

int x1 = mainStr.Trim().IndexOf(" ");
int x2 = mainStr.Trim().LastIndexOf(" ");
int x3 = mainStr.Trim().LastIndexOf(" ", x2-1);

string firstWord = mainStr.Trim().Substring(0, x1);
string middleWord = mainStr.Trim().Substring(x1, x2 - x1);
string lastWord = mainStr.Trim().Substring(x2 + 1);
string output = mainStr.Trim().Substring(x3 + 1);  // returns 123 34

vous pouvez utiliser LastOrDefault()

Meilleures performances:

string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";

var reverse = mainStr.Split(' ').Reverse();
string output = reverse.Take(1).Last() + " " + reverse.Take(2).Last();


0 commentaires

0
votes

Utilisation de Linq

Si vous voulez vraiment faire dans Linq, vous pouvez faire ce qui suit.

123 34

Mais veuillez noter que cela ne serait pas recommandé en raison de deux instructions Reverse etc.

Utilisation de RegEx

Une meilleure option serait d'utiliser Regex

var result = Regex.Match(mainStr,@"(\w*)\s(\w*)*$").Value;

Sortie

var list = mainStr.Split(new []{" "},StringSplitOptions.RemoveEmptyEntries).Reverse().Take(2).Reverse();


0 commentaires

4
votes

Prendre les deux derniers éléments en utilisant linq peut être un peu illisible, donc je suggérerais une solution multiligne sans LastIndexOf ou Substring :

var lastTwoWords = string.Join(" ", mainStr.Split().Reverse().Take(2).Reverse());

Si vous en avez vraiment besoin pour linq, vous pouvez utiliser une combinaison de Reverse et Take:

string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
var words = mainStr.Split();
var lastTwoWords = string.Join(" ", words.Skip(words.Length - 2));

p>


0 commentaires

1
votes

Je déplacerais ce que vous avez déjà dans une méthode distincte (et je le rangerais un peu):

var outputStr = Regex.Match(mainStr, "\\s(\\S+\\s\\S+$)").Groups[0].Value;

Utilisation:

var outputStr = GetLast2Words(mainStr);

Vous pouvez également utiliser des expressions régulières:

public static string GetLast2Words(string mainStr)
{
    int position = mainStr.LastIndexOf(' ', mainStr.LastIndexOf(' ') - 1);
    return position >= 0 ? mainStr.Substring(position) : null;
}
  • \ s correspond aux espaces
  • \ S correspond à n'importe quel caractère qui n'est pas un espace

Notez que la méthode d'expression régulière affichera string.Empty s'il n'y a pas de correspondance, alors que la première méthode affichera null.


0 commentaires

-1
votes

Cela pourrait être la solution si vous pouvez obtenir la longueur de la chaîne.

string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
string filterStr = String.Concat(mainStr.Skip(mainStr.Count() - 6));
Console.WriteLine(filterStr);


4 commentaires

@John Je m'excuse, j'ai changé la deuxième ligne pour qu'elle affiche maintenant 123 34.


Après votre modification, votre code affiche "23 134" si nous changeons les 2 derniers mots en "123 134". Vous abordez cela de manière incorrecte, j'en ai bien peur.


@John Vous voulez donc une solution qui affiche toujours les 2 derniers mots quelle que soit leur taille. Je m'excuse, ma solution est erronée car elle suppose que le nombre total de caractères dans les deux derniers mots sera connu et sera toujours le même.


Une solution qui affiche toujours les 2 derniers mots équivaudrait au code fourni par le demandeur.