sous Python:
$ csc regexp.cs Microsoft (R) Visual C# 2008 Compiler version 3.5.30729.5420 for Microsoft (R) .NET Framework version 3.5 Copyright (C) Microsoft Corporation. All rights reserved. $ ./regexp.exe GeorgeGeorge
4 Réponses :
Ce n'est pas clair pour moi, qu'il s'agisse d'un bug ou non, mais si vous modifiez le Ceci est sauvegardé par le code suivant: p> . * code> à . + code> Cela fait ce que vous voulez. Je soupçonne que c'est le fait que (. *) Code> correspond à une chaîne vide qui est confuse de choses. using System;
using System.Text.RegularExpressions;
class Test
{
static void Main()
{
var match = Regex.Match("abc", "(.*)");
while (match.Success)
{
Console.WriteLine(match.Length);
match = match.NextMatch();
}
}
}
Le remplacement de de sorte que la regex correspond à Je vais ajouter que le moteur JavaScript semble faire la même chose (testée ici: http://www.regular-expressions.info/javascriptexample.html ) sous IE et chrome. P> P> "" code> est "george" code> (. * code> correspondre code>) code>) et p> "ceci est un démarrage" code> et le remplace par "george" code>, et maintenant Son "curseur" est à la fin de la chaîne, où il essaie de faire correspondre la chaîne restante ( "" code>) avec le motif. Il a une correspondance pour qu'il ajoute un deuxième "george" code>. Je ne sais pas si cela est correct ou non. P>
Je crois que c'est en fait la position de départ causant la question. Il est résolu si vous modifiez la regex vers ^ (. *) Code>
est-ce un bug dans la bibliothèque d'expression régulière de C # P> blockQuote>
Peut-être, mais cela ne vous répond pas vraiment: P>
expressions régulières - C # se comporte différemment de Perl / Python P> blockQuote>
Différents moteurs d'expression réguliers et implémentations se comportent différemment. Parfois, cela explicite (et comprend des éléments d'expression réguliers différents et de la syntaxe: par exemple. Utilisation d'un
\ ( code> et\ \) code> pour grouper plutôt que par des parenthèses avec une barre oblique inverse du regroupement). p>Le livre maîtrise des expressions régulières em> (Jeffrey ef Friedl, O'Reilly ) passe beaucoup de temps à expliquer ces différences (au-dessus des différences plus fondamentales entre les approches non déterministes d'automates finis (NFA) et de l'automate (DFA) déterministiques). p>
ps. Comme les autres notent
. * Code> correspond à la chaîne vide, la première version "TOUT" est donc appariée et remplacée, la chaîne vide à la fin de l'entrée est assortie et remplacée. Si vous voulez correspondre à l'ensemble, mais éventuellement vide, l'entrée comprend des ancrages pour le début et la fin:^ (. *) $ P>. P>.
Dans votre exemple, la différence semble être dans la sémantique de la fonction "Remplacer" plutôt que dans le traitement d'expression régulier lui-même.
.NET fait un "global" remplacer, c'est-à-dire qu'il remplace toutes les correspondances plutôt que Juste la première match. P>
Remplacer global dans Perl STRAR> P> ( remarque le petit "g" à la fin de la ligne = / em>) p> qui produit p> qui produit p> puisqu'il s'arrête après le premier remplacement. P> P>
+1 Droite! Il peut le voir très facilement: $ a = ~ s /(.)/ x /; code> donne xhis est un test code> sous Perl.
Je pense que la réponse est que chaque langue a sa propre mise en œuvre d'expressions régulières. Par conséquent, une regex se comportera différemment selon laquelle le moteur est exécuté.
+1 pour la compilation de ligne de commande.