Extraire seulement la plupart des n lettres d’une chaîne

Comment puis-je extraire une sous-chaîne composée des six lettres les plus à droite d’une autre chaîne?

Ex: ma chaîne est “PER 343573”. Maintenant, je veux extraire seulement “343573”.

Comment puis-je faire ceci?

 ssortingng SubSsortingng = MySsortingng.Subssortingng(MySsortingng.Length-6); 

Ecrire une méthode d’extension pour exprimer le Right(n); fonction. La fonction doit traiter des chaînes vides ou vides renvoyant une chaîne vide, des chaînes plus courtes que la longueur maximale renvoyant la chaîne d’origine et des chaînes plus longues que la longueur maximale renvoyant la longueur maximale des caractères les plus à droite.

 public static ssortingng Right(this ssortingng sValue, int iMaxLength) { //Check if the value is valid if (ssortingng.IsNullOrEmpty(sValue)) { //Set valid empty ssortingng as ssortingng could be null sValue = ssortingng.Empty; } else if (sValue.Length > iMaxLength) { //Make the ssortingng no longer than the max length sValue = sValue.Subssortingng(sValue.Length - iMaxLength, iMaxLength); } //Return the ssortingng return sValue; } 

Probablement mieux d’utiliser une méthode d’extension:

 public static class SsortingngExtensions { public static ssortingng Right(this ssortingng str, int length) { return str.Subssortingng(str.Length - length, length); } } 

Usage

 ssortingng myStr = "ABCDEPER 343573"; ssortingng subStr = myStr.Right(6); 
 using System; public static class DataTypeExtensions { #region Methods public static ssortingng Left(this ssortingng str, int length) { str = (str ?? ssortingng.Empty); return str.Subssortingng(0, Math.Min(length, str.Length)); } public static ssortingng Right(this ssortingng str, int length) { str = (str ?? ssortingng.Empty); return (str.Length >= length) ? str.Subssortingng(str.Length - length, length) : str; } #endregion } 

Si l’erreur ne se produit pas, retourne la valeur null en tant que chaîne vide, renvoie les valeurs rognées ou de base. Utilisez-le comme “testx” .Left (4) ou str.Right (12);

MSDN

 Ssortingng mystr = "PER 343573"; Ssortingng number = mystr.Subssortingng(mystr.Length-6); 

EDIT: trop lent …

si vous n’êtes pas sûr de la longueur de votre chaîne, mais que vous êtes sûr du nombre de mots (toujours 2 mots dans ce cas, comme “xxx yyyyyy”), vous feriez mieux d’utiliser le fractionnement.

 ssortingng Result = "PER 343573".Split(" ")[1]; 

cela retourne toujours le deuxième mot de votre chaîne.

Ce n’est pas exactement ce que vous demandez, mais en regardant l’exemple, il semble que vous cherchiez la section numérique de la chaîne.

Si c’est toujours le cas, alors une bonne façon de le faire serait d’utiliser une expression régulière.

 var regex= new Regex("\n+"); ssortingng numberSsortingng = regex.Match(page).Value; 

Utilisez ceci:

 Ssortingng text = "PER 343573"; Ssortingng numbers = text; if (text.Length > 6) { numbers = text.Subssortingng(text.Length - 6); } 

Devinez à vos besoins, mais l’expression régulière suivante ne donnera que 6 caractères alphanumériques avant la fin de la chaîne et aucune correspondance sinon.

 ssortingng result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value; 

Utilisez ceci:

ssortingng mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));

Étant donné que vous utilisez .NET, que tous comstacknt en MSIL , faites simplement référence à Microsoft.VisualBasic et utilisez la méthode Ssortingngs.Right à Ssortingngs.Right :

 using Microsoft.VisualBasic; ... ssortingng input = "PER 343573"; ssortingng output = Ssortingngs.Right(input, 6); 

Pas besoin de créer une méthode d’extension personnalisée ou un autre travail. Le résultat est obtenu avec une référence et une ligne de code simple.

Pour plus d’informations à ce sujet, l’utilisation de méthodes Visual Basic avec C # a été documentée ailleurs . J’ai personnellement trébuché dessus en essayant d’abord d’parsingr un fichier et j’ai trouvé que ce thread SO utilisant la classe Microsoft.VisualBasic.FileIO.TextFieldParser était extrêmement utile pour parsingr des fichiers .csv.

C’est la méthode que j’utilise: j’aime garder les choses simples.

 private ssortingng TakeLast(ssortingng input, int num) { if (num > input.Length) { num = input.Length; } return input.Subssortingng(input.Length - num); } 

Méthodes sans danger:

Chaînes plus courtes que la longueur maximale renvoyant la chaîne d’origine

Méthode d’extension à droite

 public static ssortingng Right(this ssortingng input, int count) => Ssortingng.Join("", (input + "").ToCharArray().Reverse().Take(count).Reverse()); 

Méthode d’extension Ssortingng Left

 public static ssortingng Left(this ssortingng input, int count) => Ssortingng.Join("", (input + "").ToCharArray().Take(count)); 

Voici la solution que j’utilise … Elle vérifie que la longueur de la chaîne d’entrée n’est pas inférieure à la longueur demandée. Les solutions que je vois ci-dessus ne prennent pas cela en compte malheureusement, ce qui peut conduire à des pannes.

  ///  /// Gets the last x- of characters from the given ssortingng. /// If the given ssortingng's length is smaller than the requested  the full ssortingng is returned. /// If the given  is negative, an empty ssortingng will be returned. ///  /// The ssortingng from which to extract the last x- of characters. /// The amount of characters to return. /// The last x- of characters from the given ssortingng. public static ssortingng GetLast(this ssortingng @ssortingng, int amount) { if (@ssortingng == null) { return @ssortingng; } if (amount < 0) { return String.Empty; } if (amount >= @ssortingng.Length) { return @ssortingng; } else { return @ssortingng.Subssortingng(@ssortingng.Length - amount); } } 

Une autre solution qui ne peut être mentionnée

 S.Subssortingng(S.Length < 6 ? 0 : S.Length - 6) 

Juste une pensée:

 public static ssortingng Right(this ssortingng @this, int length) { return @this.Subssortingng(Math.Max(@this.Length - length, 0)); } 

Sans recourir au convertisseur de bits et au décalage de bits (il faut s’assurer de l’encodage), c’est la méthode la plus rapide que j’utilise comme méthode d’extension ‘Right’.

 ssortingng mySsortingng = "123456789123456789"; if (mySsortingng > 6) { char[] cSsortingng = mySsortingng.ToCharArray(); Array.Reverse(mySsortingng); Array.Resize(ref mySsortingng, 6); Array.Reverse(mySsortingng); ssortingng val = new ssortingng(mySsortingng); } 

J’utilise le Min pour éviter les situations négatives et gère également les chaînes NULL

 //  /// Returns a ssortingng containing a specified number of characters from the right side of a ssortingng. ///  public static ssortingng Right(this ssortingng value, int length) { ssortingng result = value; if (value != null) result = value.Subssortingng(0, Math.Min(value.Length, length)); return result; } 
 using Microsoft.visualBasic; public class test{ public void main(){ ssortingng randomSsortingng = "Random Word"; print (Ssortingngs.right(randomSsortingng,4)); } } 

la sortie est “Word”

 //s - your ssortingng //n - maximum number of right characters to take at the end of ssortingng (new Regex("^.*?(.{1,n})$")).Replace(s,"$1") 
 var str = "PER 343573"; var right6 = ssortingng.IsNullOrWhiteSpace(str) ? ssortingng.Empty : str.Length < 6 ? str : str.Substring(str.Length - 6); // "343573" // alternative var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "343573" 

Cela prend en charge n'importe quel nombre de caractères dans le str . le code alternatif ne supporte pas la chaîne null . et le premier est plus rapide et le second plus compact.

Je préfère le second si je connais le str contenant une chaîne courte. s'il s'agit d'une longue chaîne, la première convient mieux.

par exemple

 var str = ""; var right6 = ssortingng.IsNullOrWhiteSpace(str) ? ssortingng.Empty : str.Length < 6 ? str : str.Substring(str.Length - 6); // "" // alternative var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "" 

ou

 var str = "123"; var right6 = ssortingng.IsNullOrWhiteSpace(str) ? ssortingng.Empty : str.Length < 6 ? str : str.Substring(str.Length - 6); // "123" // alternative var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "123"