2010-04-17 6 views
2

Supposons que je veux faire correspondre "abc" dans la chaîne s seulement si elle se produit exactement à l'index n.Comment Regex.IsMatch à un décalage spécifié dans .NET?

int n = 2; 
Console.WriteLine(new Regex("abc").IsMatch("01abc", n)); // true 
Console.WriteLine(new Regex("abc").IsMatch("0123abc", n)); // true (but want false) 
Console.WriteLine(new Regex("^abc").IsMatch("01abc", n)); // false (but want true) 

semble que la seule façon d'y parvenir sans utiliser Substring sur l'entrée est quelque chose comme ceci:

var match = new Regex("abc").Match("0123abc", n); 
Console.WriteLine(match.Success && match.Index == n); 

Ce n'est pas trop mal, sauf que quand il n'y a pas de match à le décalage de départ, puis entier entrée sera analysée inutilement, ce qui est probablement plus lent pour la plupart des expressions régulières que la création en fait une sous-chaîne avant la correspondance. (Je n'ai pas le temps cependant). Est-ce qu'il me manque une surcharge ou un réglage évident qui limiterait une correspondance au décalage fourni uniquement?

+0

: O Je voulais faire exactement cela aussi, mais je ne pensais pas que c'était possible. Merci de demander ceci :) – mpen

Répondre

3

Utilisation \G:

var match = new Regex(@"\Gabc").Match("0123abc", n); 

De the docs:

Si vous souhaitez restreindre un match pour qu'il commence à une position de caractère particulier dans la chaîne et le moteur d'expression régulière ne scanne pas le reste de la chaîne pour am atch, ancrer l'expression régulière avec un \G ... Cela restreint la correspondance donc il doit commencer exactement à startat.

0

Vous pouvez utiliser \G au début de votre regex pour vous assurer qu'il correspond au début.

(^ ne fonctionne pas).

test dans PowerShell:

 
PS> $r = [regex]"\Gabc" 
PS> $r.IsMatch("01abc",2) 
True 
PS> $r.IsMatch("012abc",2) 
False 
+0

Pourriez-vous montrer un exemple, s'il vous plaît? J'ai montré un qui ne fonctionne pas.^ne correspond pas aux décalages. –

+0

@romkyns: Cela montre que je devrais tester d'abord :-(Mais il semble que '\ G' fonctionne ... mettre à jour la réponse. – Richard

Questions connexes