MDX正则表达式解析错误

时间:2016-08-16 18:46:18

标签: c# regex

我可能应该因为问这个问题而被烧死了,但我不能为我的生活弄清楚为什么当我尝试在Visual Studio中调试这个片段时会抛出这个异常。我已经测试了这个正则表达式的CLR VB实现,它返回了预期的表结果:

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;
    }
}

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:0)

Rookie错误的参数顺序。这个电话实际上应该是这样的:

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和@AlanMoore指出这一点!