2016-08-16 4 views
-1

Ich verdiene es wahrscheinlich, auf dem Scheiterhaufen verbrannt zu werden, um das zu fragen, aber ich kann nicht für das Leben von mir herausfinden, warum diese Ausnahme geworfen wird, wenn ich versuche, dieses Snippet in Visual Studio zu debuggen. Ich habe die CLR VB Implementierung für diese regex getestet und es gibt die erwartete Tabelle Ergebnis:MDX regex Parsingfehler

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 scheint eine nicht behandelte Ausnahme anzuzeigen. Die C# -Implementierung:

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

Jede Hilfe wird sehr geschätzt :)

+0

Muster ist in Ordnung, welche Art von Ausnahme in C# wirft es. – sln

+0

ArgumentException. Es heißt, dass der [x-y] -Bereich in umgekehrter Reihenfolge ist, aber ich bin mir nicht sicher, wie ich das beheben kann, ohne die Regex zu unterbrechen. – dgills

+0

Sie haben die Argumente umgekehrt. Wenn man behandelt, was die Eingabe als Regex sein soll, sieht man '[Product-To-Order%]' als eine Zeichenklasse mit den Bereichen 't-T' und 'o-O', die ungültig sind. –

Antwort

0

Rookie Fehler mit dem Argument um. Der Anruf sollte eigentlich so aussehen:

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

Danke @sln und @AlanMoore für das Aufzeigen dieser!