2013-04-18 8 views
-5

je une chaîne que je voudrais partager envoudrais partager une chaîne en utilisant un motif regex

var finalQuote = "2012-0001-1"; 
var quoteNum = "2012-0001"; 
var revision = "1" 

je quelque chose comme ça

var quoteNum = quoteNum.subString(0,9); 
var revision = quoteNum.subString(quoteNum.lastIndexOf("-") + 1); 

Mais ça ne peut pas être fait utiliser regex plus efficacement? Je rencontre des modèles comme celui-ci qui doivent être divisés en deux.

var finalQuote = "2012-0001-1"; 
string pat = @"(\d|[A-Z]){4}-\d{4}"; 
Regex r = new Regex(pat, RegexOptions.IgnoreCase); 
Match m = r.Match(text); 
var quoteNum = m.Value; 

Jusqu'ici j'ai atteint ici. Mais je sens que je n'utilise pas la bonne méthode. Guidez-moi s'il-vous-plaît.

EDIT: Je veux éditer par le modèle. Le fractionnement avec des tirets n'est pas une option car la première partie de la division contient un tiret. à savoir, "2012-0001"

+2

Je ne suis pas un mec C#, mais est-ce qu'il a une fonctionnalité «split» comme Javascript? Alors vous pouvez juste 'finalQuote.split (" - ") [1]' et obtenir votre valeur '0001'. – Shaded

+7

Regex est peu connu pour son efficacité. –

+2

Si vous avez un nombre fixe de caractères, il vaut mieux utiliser votre méthode de sous-chaîne. –

Répondre

1

Je suis d'accord avec les autres que l'utilisation de la sous-chaîne est une meilleure solution que regex pour cela. Mais si vous insistez sur l'utilisation regex vous pouvez utiliser quelque chose comme:

^(\d{4}-\d{4})-(\d)$ 

Untested depuis que je n'ai pas un environnement C# installé:

var finalQuote = "2012-0001-1"; 
string pat = @"^(\d{4}-\d{4})-(\d)$"; 
Regex r = new Regex(pat); 
Match m = r.Match(finalQuote); 
var quoteNum = m.Groups[1].Value; 
var revision = m.Groups[2].Value; 

Sinon, si vous voulez un string[] vous pourrait essayer (encore une fois, non testé):

string[] data = Regex.Split("2012-0001-1",@"-(?=\d$)"); 

data[0] serait quoteNum et serait revision.


Mise à jour:

Explication du Regex.Split:

De la documentation Regex.Split: Les méthodes de Regex.Split sont similaires à la méthode String.Split, sauf que Regex.Split divise la chaîne à un délimiteur déterminé par une expression régulière au lieu d'un ensemble de caractères.

Le regex -(?=\d$) correspond à un seul - donné est suivi par a digit followed by the end of the string il donc que correspondre au dernier tiret de la chaîne. Le dernier chiffre n'est pas consommé parce que nous utilisons un zero-width lookahead assertion(?=)

+0

+1. ce one-liner est génial. ça marche pour moi. Pouvez-vous expliquer cela un peu? je n'ai pas beaucoup compris. – naveen

+0

@naveen Voir ma réponse mise à jour. – rvalvik

4

Je voudrais simplement aller avec:

var quoteNum = finalQuote.Substring(0,9); 
var revision = finalQuote.Substring(10); 

quoteNum comprendrait les 9 premiers caractères et revision du 10 et tout ce qui peut suivre le 10, par exemple Si la révision est de 10 ou plus, cela fonctionnera toujours.

L'utilisation d'expressions rationnelles compliquées ou de méthodes d'extension est très rapide; parfois les méthodes simples sont assez efficaces par elles-mêmes.

1

sIl serait plus facile de maintenir à l'avenir si vous aviez quelque chose que le nouveau venu comprendrait.

vous pouvez utiliser:

var finalQuote = "2012-0001-1"; 
string[] parts = finalQuote.Split("-"); 
var quoteNum = parts[0] + "-" + parts[1] ; 
var revision = parts[3]; 

Toutefois, si vous insiste sur le fait que vous avez besoin d'une regex puis

(\d{4}-\d{4})-(\d) 

Il y a deux groupes dans cette expression, groupe 1 capture la première partie et le groupe 2 capture La seconde partie.

var finalQuote = "2012-0001-1"; 
string pat = @"(\d{4}-\d{4})-(\d)"; 
Regex r = new Regex(pat, RegexOptions.IgnoreCase); 
Match m = r.Match(finalQuote); 
var quoteNum = m.Groups[1].Value; 
var revision = m.Groups[2].Value; 
+0

merci, je comprends. C'est ce qui est recherché. vous voudrez peut-être changer le code comme ça, non? 'var quoteNum = m.Groups [1] .Value; var révision = m.Groups [2] .Value; 'as' Groups [0] .value' renvoie la chaîne transmise elle-même. J'espérais vraiment apprendre et votre code a fonctionné brillamment pour moi. merci encore une fois – naveen

+0

j'aurais aimé marquer votre réponse aussi :) merci encore .... – naveen

Questions connexes