2010-08-10 2 views
3

Ceci est mon premier message de pile. J'espère que vous pouvez aider.Utilisation de .NET RegEx pour récupérer une partie d'une chaîne après la seconde '-'

J'ai plusieurs chaînes dont j'ai besoin de rompre pour une utilisation ultérieure. Voici quelques exemples de ce que je veux dire ....

fred-064528-NEEDED 
frederic-84728957-NEEDED 
sam-028-NEEDED 

Comme vous pouvez le voir ci-dessus les longueurs de chaîne varient considérablement si regex je crois est la seule façon d'obtenir ce que je veux. ce dont j'ai besoin, c'est le reste de la chaîne après le second trait d'union ('-'). Je suis très faible à regex donc toute aide serait super.

Merci d'avance.

+0

J'ai utilisé votre problème comme un petit exercice d'apprentissage: http://stackoverflow.com/questions/3448269/pimp-my-linq-a-learning-exercise-based-upon-another-sa-question Merci! –

Répondre

2

Quelque chose comme ça. Il faudra tout (sauf les sauts de ligne) après le second '-' y compris le signe '-'.

var exp = @"^\w*-\w*-(.*)$"; 

var match = Regex.Match("frederic-84728957-NEE-DED", exp); 

if (match.Success) 
{ 
    var result = match.Groups[1]; //Result is NEE-DED 

    Console.WriteLine(result); 
} 

EDIT: répondis-je une autre question qui se rapporte à ce sujet. Sauf, il a demandé une solution LINQ et ma réponse était la suivante, que je trouve assez claire.

Pimp my LINQ: a learning exercise based upon another post

var result = String.Join("-", inputData.Split('-').Skip(2)); 

ou

var result = inputData.Split('-').Skip(2).FirstOrDefault(); //If the last part is NEE-DED then only NEE is returned. 

Comme mentionné dans l'autre thread SO il est pas le moyen le plus rapide de le faire.

2

Si elles font partie du plus grand texte:

(\w+-){2}(\w+) 

Si sont présentés sous forme de lignes entières, et vous savez que vous n'avez pas d'autres traits d'union, vous pouvez également utiliser:

[^-]*$ 

Une autre option, si vous avez chaque ligne comme une chaîne, est d'utiliser split (encore une fois, selon que vous attendez ou non des traits d'union supplémentaires, vous pouvez omettre le paramètre count, ou utiliser LastIndexOf):

string[] tokens = line.Split("-".ToCharArray(), 3); 
string s = tokens.Last(); 
1

Cela devrait fonctionner:

.*?-.*?-(.*) 
0

Cela devrait faire l'affaire:

([^\-]+)\-([^\-]+)\-(.*?)$ 
0

le motif regex sera

(?<first>.*)?-(?<second>.*)?-(?<third>.*)?(\s|$) 

alors vous pouvez obtenir le groupe nommé "deuxième" pour obtenir le test après le 2ème trait d'union

alternativement

vous pouvez faire un string.split('-') et obtenir le 2 élément du tableau

4

Juste pour offrir une alternative sans utiliser regex:

foreach(string s in list) 
{ 
    int x = s.LastIndexOf('-') 
    string sub = s.SubString(x + 1) 
} 

Ajouter la validation au goût.

+2

vous aurez besoin de 's.SubString (x + 1)' ici, ou il comprend le dernier '-'. – Kobi

+0

merci pour la suggestion kobi –

Questions connexes