2009-09-27 4 views
4

Je me dis que regex est trop compliqué aussi il me faut du temps pour écrire du code (je suppose que je devrais apprendre maintenant que je connais quelques regex).Simple get string (ignorer les chiffres à la fin) en C#

Quel est le moyen le plus simple de séparer la chaîne d'une chaîne alphanumérique? Ce sera toujours LLLLDDDDD. Je veux seulement les lettres (l's), typiquement ses 1 ou 2 lettres seulement.

+2

J'ai résisté à l'apprentissage des expressions régulières pendant de nombreuses années. Ne sois pas moi. –

Répondre

11

TrimEnd:

string result = input.TrimEnd(new char[]{'0','1','2','3','4','5','6','7','8','9'}); 
// I'm sure using LINQ and Range can simplify that. 
// also note that a string like "abc123def456" would result in "abc123def" 

Mais RegEx est aussi simple:

string result = Regex.Match(input,@"^[^\d]+").Value; 
+0

wow je n'avais aucune idée que vous pouvez avoir un regex d'un liner. –

+1

Toutes les expressions régulières ne doivent pas être compliquées. En fait, certaines des plus complexes peuvent parfois être mieux remplacées par une construction de code traditionnelle. Connaître seulement quelques concepts (Classes de caractères, Backtracking, Groupes nommés) est assez bon pour résoudre de manière efficace un grand nombre de problèmes quotidiens de gestion de chaînes - cela vaut vraiment la peine d'apprendre les bases! –

+3

La solution RegEx ne fonctionne pas. Pour l'entrée: asfsdf23424Aasdfsf222, il affichera asfsdf. Il devrait être asfsdf23424Aasdfsf – DarkPixel

10

Je préfère la réponse regex Michael Stum, mais voici une approche LINQ ainsi:

string input = "ABCD1234"; 
string result = new string(input.TakeWhile(c => Char.IsLetter(c)).ToArray()); 
+0

+1 Pas de magie ici, c'est compréhensible en lecture. –

+0

Très belle réponse. Mais n'a pas couvert toutes les bases: Il commence au début, seulement les chars de lettre réputés valides, et s'arrête à la ** première ** occurrence non valide qui échouerait (selon vos besoins) pour quelque chose comme 'input =" ABCD1234EFGH5678 " ' –

3

Vous peut utiliser une expression régulière qui correspond aux chiffres pour les supprimer:

input = Regex.Replace(input, "\d+$", String.Empty); 

L'ancienne boucle fashioned est pas mal non plus, il devrait en fait être la solution la plus rapide:

int len = input.Length; 
while (input[len-1] >= '0' && input[len-1] <= '9') len--; 
input = input.Substring(0, len); 
+1

Cela^devrait être un $ - sinon vous faites correspondre des nombres avant le début de la chaîne;) –

+0

@Richard: Oui, vous avez absolument raison. :) – Guffa

0

Ils l'ont obtenu - les bonnes solutions noter utilisent pas l'opérateur d'utiliser la description du problème : "Not numbers" si vous aviez les numéros à l'avant semble de mes gains limités que vous devez avoir ce que l'on appelle des groupes de capture pour passer tout ce qu'il est sur la partie frontale de la chaîne. Le paradigme de conception que j'utilise maintenant n'est pas un caractère délimiteur, suivi d'un caractère délimiteur, suivi d'une accolade ouvrante. Il en résulte un besoin d'un caractère délimiteur qui n'est pas dans l'ensemble de résultats, ce qui pour une chose peut être des valeurs ascii bien établies pour les délimiteurs de données, par exemple 0x0019/0x0018 et ainsi de suite.