你能帮我理解什么是错的吗?我有通常的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
答案 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
很抱歉打扰,发现答案。