与RegEx.Replace不同,C#RegEx.Matches不返回表达式内的所有子匹配

时间:2010-10-10 17:03:05

标签: sql regex c#-3.0

你能帮我理解什么是错的吗?我有通常的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";

BUT!如果我尝试使用具有相同选项和相同输入字符串的Regex.Matches ...它只找到一个匹配。

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

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

WHY ???这是一个错误,还是我应该为每个子表达式创建一个单独的命名组?有谁知道为什么会这样,为什么只找到第一场比赛?

P.S。正则表达式是正确的 - 我相信你可以在这里查看 - http://www.gskinner.com/RegExr/

谢谢,Artem

1 个答案:

答案 0 :(得分:2)

抱歉,我认为我是如此愚蠢,因为我不知道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

很抱歉打扰,发现答案。