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