C # RegEx.Matches не возвращает все подсовпадения внутри выражения в отличие от RegEx.Replace - PullRequest
0 голосов
/ 10 октября 2010

Не могли бы вы помочь мне понять, что не так.У меня есть обычный запрос SQL:

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]";

И мне нужно определить местоположение части FROM до ее псевдонима AS.Я сделал следующее с RegEx.Replace:

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

И все работает нормально - это вернет:

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

НО!Если я пытаюсь использовать Regex.Matches с теми же параметрами и той же входной строкой ... он находит только одно совпадение.

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

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

ПОЧЕМУ ???Это ошибка, или я должен создать отдельную именованную группу для каждого подвыражения?Кто-нибудь знает, почему это происходит, почему только первый матч был найден?

PS Регулярное выражение верно - я уверен, вы можете проверить это здесь - http://www.gskinner.com/RegExr/

Спасибо, Артем

1 Ответ

2 голосов
/ 10 октября 2010

Извините, я думаю, что был настолько глуп, потому что я не знал, как именно работает метод Regex.Matches, и теперь я понял, что в любом случае я должен использовать Regex.Match и его свойство "Groups":

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

Извините за беспокойство, ответ найден.

...