2010-08-16 4 views
0

J'essaie de convertir un script Perl en routine C# 3.5.Regex.split, comment lire à gauche du modèle correspondant

Le code perl J'est:

if($work =~ /\<[0-9][0-9][0-9]\>/){ 
    $left  = $`; 
    $match  = $&; 
    $work  = $'; 
} 

En C# J'écrit le code suivant:

string[] sSplit = Regex.Split(work, @"\<[0-9][0-9][0-9]\>"); 
if sSplit.length is > 2 
{ 
    left = sSplit[0]; 
    match = sSplit[1]; 
    work = sSPlit[2]; 
} 

Cependant ce qui précède ne me donne pas le modèle adapté à sSplit[1], mais le contenu le droit de la chaîne correspondante à la place.

Répondre

4

Regex.Split n'est pas ce dont vous avez besoin. L'équivalent de =~ /.../ est Regex.Match.

Cependant, Regex.Match n'a pas d'équivalent à Perl $` ou $', vous devez donc utiliser une solution de contournement, mais je pense qu'il est un juste un:

var m = Regex.Match(work, @"^(.*?)(\<[0-9][0-9][0-9]\>)(.*)$", RegexOptions.Singleline); 
if (m.Success) 
{ 
    left = m.Groups[0].Value; 
    match = m.Groups[1].Value; // perhaps with Convert.ToInt32()? 
    work = m.Groups[2].Value; 
} 

Vous pouvez également utiliser l'index de correspondance et la longueur obtenir la substance:

var m = Regex.Match(work, @"^\<[0-9][0-9][0-9]\>"); 
if (m.Success) 
{ 
    left = work.Substring(0, m.Index); 
    match = m.Value; // perhaps with Convert.ToInt32()? 
    work = work.Substring(m.Index + m.Length); 
} 
+0

Est-ce que vous voulez pas non plus à la fin trop ou (. *) sur les deux? Je me demande simplement ce qui se passe si la chaîne correspondante se répète et que vous voulez obtenir toutes les correspondances et ce qui est à gauche et à droite ... Bien que ce soit un peu au-delà de la portée de cette question. – Chris

+1

@Chris: Si le second est '(. *?)' Ou '(. *)' Ne fait aucune différence à cause du '$' qui le suit. Le premier est important: c'est '(. *?)' Pour que vous obteniez la première correspondance. Avec '(. *)' Vous obtiendrez le dernier. – Timwi

+0

tout le monde, merci beaucoup pour toute votre aide! – Desai

2

Lorsque vous essayez des expressions régulières, je recommendons toujours RegexHero, qui est un outil en ligne qui permet de visualiser vos expressions régulières .NET. Dans ce cas, utilisez Regex.Match et utilisez Groups. Cela donnera ce que vous voulez.

Notez que la barre oblique inversée dans \< et \> ne sont pas nécessaires en C# (ni en Perl, btw).

Notez également que $`, $& et $' ont des équivalents en C# lorsqu'ils sont utilisés dans une expression de remplacement. Si c'est ce dont vous avez besoin à la fin, vous pouvez utiliser ces "variables magiques", mais seulement dans Regex.Replace.

1

Un split demande habituellement à de lancer et d'éloigner les délimiteurs. Perl agit exactement de la même façon (sans les variables de type $& verboten.)

Vous capturez delimters en Perl en mettant parens autour d'eux: (. *?)

my @parts = split /(<[0-9][0-9][0-9]>)/; # includes the delimiter 
my @parts = split /<[0-9][0-9][0-9]>/; # doesn't include the delimiter 
+0

s/verboten/non-recommandé / – ysth

Questions connexes