C# MDX正则表达式解析错误
我可能会因为问这个问题而被烧死,但我一辈子都不明白为什么在VisualStudio中调试这段代码时会抛出这个异常。我已经为此正则表达式测试了CLR VB实现,它返回了预期的表结果:C# MDX正则表达式解析错误,c#,regex,C#,Regex,我可能会因为问这个问题而被烧死,但我一辈子都不明白为什么在VisualStudio中调试这段代码时会抛出这个异常。我已经为此正则表达式测试了CLR VB实现,它返回了预期的表结果: MDX String Index Length [Measures].[Product-To-Order %] 8 31 [Measures].[Gross Reven
MDX String Index Length
[Measures].[Product-To-Order %] 8 31
[Measures].[Gross Revenue (Stable)] 40 35
[Measures].[Product Count] 76 26
[Measures].[Total Order Count] 103 30
[Measures].[Average SKU Discount] 134 33
[Measures].[Average SKU Price Per Purchased Item] 168 49
[Component SKU].[Component SKU by Master Class].[All] 333 53
[Component SKU].[Component SKU by Master Class].[All] 690 53
[XL_Filter_Set_0] 749 17
[XL_Filter_Set_0] 806 17
[XL_Filter_HelperSet_0] 835 23
[XL_Filter_HelperSet_0] 887 23
...
Visual Studio似乎表明存在未处理的异常。C#实施:
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Collections;
public static class RegExFunctions {
// RegEx matches
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true, IsPrecise = true, Name = "RegExMatches",
SystemDataAccess = SystemDataAccessKind.None, FillRowMethodName = "RegExMatchesRow")]
public static IEnumerable RegExMatches(SqlString input, SqlString pattern, SqlInt32 options)
{
try
{
if (input.IsNull || pattern.IsNull) return null;
Console.WriteLine(input);
Console.WriteLine(pattern);
IEnumerable matches = Regex.Matches(input.Value, pattern.Value, (RegexOptions)options.Value);
Console.WriteLine(matches);
//return matches;
return Regex.Matches(input.Value, pattern.Value, (RegexOptions)options.Value);
}
catch (RegexMatchTimeoutException)
{
// Do nothing. Assume that a timeout represents no match.
return null;
}
}
public static int Main()
{
IEnumerable result =
RegExMatches(
@"\[[^\]]*\](\.(&)?\[[^\]]*\])*",
@"SELECT {[Measures].[Product-To-Order %],[Measures].[Gross Revenue (Stable)],[Measures].[Product Count],[Measures].[Total Order Count],[Measures].[Average SKU Discount],[Measures].[Average SKU Price Per Purchased Item]} DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME ON COLUMNS , NON EMPTY Hierarchize({DrilldownLevel({[Component SKU].[Component SKU by Master Class].[All]},,,INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME,[Component SKU].[Component SKU by Master Class].[Master Component Class].[Class Category],[Component SKU].[Component SKU by Master Class].[Master Component Class].[ClID] ON ROWS FROM (SELECT Generate(Hierarchize({[Component SKU].[Component SKU by Master Class].[All]}) AS [XL_Filter_Set_0], TopCount(Filter(Except(DrilldownLevel([XL_Filter_Set_0].Current AS [XL_Filter_HelperSet_0], , 0,INCLUDE_CALC_MEMBERS), [XL_Filter_HelperSet_0]), Not IsEmpty([Measures].[Product-To-Order %])), 30, [Measures].[Product-To-Order %])) ON COLUMNS FROM [CLV] WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703])) WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703]) CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS",
1
);
Console.WriteLine(result);
return 0;
}
}
非常感谢您的帮助:)新手在论点顺序上犯了错误。该调用实际上应该如下所示:
public static int Main()
{
IEnumerable result =
RegExMatches(
@"SELECT {[Measures].[Product-To-Order %],[Measures].[Gross Revenue (Stable)],[Measures].[Product Count],[Measures].[Total Order Count],[Measures].[Average SKU Discount],[Measures].[Average SKU Price Per Purchased Item]} DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME ON COLUMNS , NON EMPTY Hierarchize({DrilldownLevel({[Component SKU].[Component SKU by Master Class].[All]},,,INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME,[Component SKU].[Component SKU by Master Class].[Master Component Class].[Class Category],[Component SKU].[Component SKU by Master Class].[Master Component Class].[ClID] ON ROWS FROM (SELECT Generate(Hierarchize({[Component SKU].[Component SKU by Master Class].[All]}) AS [XL_Filter_Set_0], TopCount(Filter(Except(DrilldownLevel([XL_Filter_Set_0].Current AS [XL_Filter_HelperSet_0], , 0,INCLUDE_CALC_MEMBERS), [XL_Filter_HelperSet_0]), Not IsEmpty([Measures].[Product-To-Order %])), 30, [Measures].[Product-To-Order %])) ON COLUMNS FROM [CLV] WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703])) WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703]) CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS",
@"\[[^\]]*\](\.(&)?\[[^\]]*\])*",
1
);
Console.WriteLine(result);
return 0;
}
感谢@sln和@Alanmore指出这一点 模式很好,它在C#中抛出什么样的异常。ArgumentException。它说[x-y]范围的顺序是相反的,但我不确定如何在不破坏正则表达式的情况下实际修复这个问题。你的论点是相反的。将应该是输入的内容视为正则表达式,它将
[Product to Order%]
视为一个字符类,包括无效的范围t-t
和o-o
。Ha-我一直在调试函数,但没有检查实际的参数顺序。猜一猜,如果我对.net不是那么陌生的话,我会更好地阅读字里行间的异常。非常感谢你!