2010-10-10 8 views
0

Pourriez-vous m'aider à comprendre ce qui ne va pas. J'ai la requête SQL habituelle:C# RegEx.Matches ne renvoie pas toutes les sous-correspondances dans l'expression contrairement à RegEx.Replace

var SQL = "SELECT [Extent1].[RouteID] AS [RouteID] 
      FROM [RoutesEntities].[Routes] AS [Extent1]\r\n 
      INNER JOIN [dbo].[Locales] AS [Extent2] 
      ON [Extent2].[LocaleID] = [Extent1].[LocaleID]"; 

Et j'ai besoin de définir l'emplacement de la partie FROM jusqu'à son alias AS. j'ai fait ce qui suit avec Regex.Replace:

var pattern = @"(FROM[^(SELECT)]+?Routes.+?AS.+?\[?([^\]\s]+)\]?)"; 
var result = Regex.Replace(SQL, pattern, "$1 $2", RegexOptions.Singleline | RegexOptions.IgnoreCase); 

Et cela fonctionne très bien - ce sera de retour:

match_$1 = "FROM [RoutesEntities].[Routes] AS [Extent1]"; 
match_$2 = "Extent1"; 

MAIS! Si j'essaie d'utiliser Regex.Matches avec les mêmes options et la même chaîne d'entrée ... il ne trouve qu'une seule correspondance.

MatchCollection queryPlace = Regex.Matches(
       SQL, 
       @"(FROM[^(SELECT)]+?Routes.+?AS.+?\[?([^\]\s]+)\]?)", 
       RegexOptions.IgnoreCase | RegexOptions.Singleline 
); 

match_$1 = "FROM [RoutesEntities].[Routes] AS [Extent1]"; 

POURQUOI ??? Est-ce un bug, ou devrais-je créer un groupe nommé séparé pour chaque sous-expression? Est-ce que quelqu'un sait pourquoi cela se produit, pourquoi seulement le premier match a été trouvé?

P.S. Regex est correct - je suis sûr, vous pouvez vérifier ici - http://www.gskinner.com/RegExr/

Remerciez, Artem

Répondre

2

Désolé, je pense que je suis si stupide parce que je ne savais pas comment fonctionne exactement la méthode de Regex.Matches et maintenant i Entendu que dans tous les cas que je devrais utiliser Regex.Match et ses « Groupes » biens:

Match queryPlace = Regex.Match(
       _queryData.CommandText, 
       @"(FROM[^(SELECT)]+?" + tableInner + @".+?AS.+?\[?([^\]\s]+)\]?)", 
       RegexOptions.IgnoreCase | RegexOptions.Singleline 
      ); 
      String innerAlias = ""; 
var d = queryPlace.Groups[0];  // FROM [RoutesEntities].[Routes] AS [Extent1] 
var d1 = queryPlace.Groups[1]; // FROM [RoutesEntities].[Routes] AS [Extent1] 
var d2 = queryPlace.Groups[2]; // Extent1 

Désolé pour dérangeant, réponse se trouve.

Questions connexes