2016-03-31 2 views
1

Учитывая следующую строку: многострочногодобывающих значения, начиная с определенной строкой символов и вплоть до определенной строки символов

WHERE ([EXTENT1].[MY_ID] IN (151,152,214,218,931,932,933,1067,1412,1414,13807,14347,14349,14446)) AND ([EXTENT1].[MY_OTHER_ID] IN (14264, 14335, 14385, 14398, 14603, 14650, 15164, 15374)) AND ([EXTENT2].[PERSON_ID] IN (28,933,14446,179,152,14349,14347,933,130,218,933,1067,931,151,214,152,933,145,931,145,5809,14347,14349,14349,1414,142,1412,179,152,14347,152,90,13807,932,931)) 
    ) AS [FILTER1] 
    GROUP BY [K1], [K2] 
) AS [GROUPBY1] 

Я хочу, чтобы извлечь введенное значение пункта IN для [my_id]. Я могу использовать следующее регулярное выражение (?<=\.\[MY_ID\].*IN.*\().* усечение от первой части строки и возврата:

151,152,214,218,931,932,933,1067,1412,1414,13807,14347,14349,14446)) AND ([EXTENT1].[MY_OTHER_ID] IN (14264, 14335, 14385, 14398, 14603, 14650, 15164, 15374)) AND ([EXTENT2].[PERSON_ID] IN (28,933,14446,179,152,14349,14347,933,130,218,933,1067,931,151,214,152,933,145,931,145,5809,14347,14349,14349,1414,142,1412,179,152,14347,152,90,13807,932,931)) 

Но я не могу понять, как заставить его остановиться на первом закрытии) в пункте.

То, что я после того, как есть: 151,152,214,218,931,932,933,1067,1412,1414,13807,14347,14349,14446

Регулярное выражение в конечном итоге будет использоваться с .NET регулярных выражений.

ответ

1

Благодаря тому, что .NET поддерживает регулярное выражение повторяющиеся группы, вы можете использовать

\.\[MY_ID]\s*IN\s*\(((?:,?(\d+))+) 

и захватить либо значение Группа 1 (что будет 151,152,214,218,931,932,933,1067,1412,1414,13807,14347,14349,14446) или все записи из коллекции захвата группы 2 в виде массива/списка.

См regex demo

Объяснения:

  • \.\[MY_ID] - буквальный .[MY_ID]
  • \s* - 0+ пробельные
  • IN\s* - IN слово следует с 0+ пробельного
  • \( - открытие литерал (
  • ((?:,?(\d+))+) - Группа 1 1+ захвата последовательности:
    • ,? - один или нулевой запятой
    • (\d+) - 2-й группы захвата 1+ цифр.

А вот C# demo:

var s = "WHERE ([EXTENT1].[MY_ID] IN (151,152,214,218,931,932,933,1067,1412,1414,13807,14347,14349,14446)) AND ([EXTENT1].[MY_OTHER_ID] IN (14264, 14335, 14385, 14398, 14603, 14650, 15164, 15374)) AND ([EXTENT2].[PERSON_ID] IN (28,933,14446,179,152,14349,14347,933,130,218,933,1067,931,151,214,152,933,145,931,145,5809,14347,14349,14349,1414,142,1412,179,152,14347,152,90,13807,932,931))\n ) AS [FILTER1]\n GROUP BY [K1], [K2]\n) AS [GROUPBY1]"; 
var pattern = @"\.\[MY_ID]\s*IN\s*\(((?:,?(\d+))+)"; 
var matches = Regex.Matches(s, pattern); 
var res1 = matches 
       .Cast<Match>().Select(p => p.Groups[2].Captures) // Get a list of ind. numbers 
       .ToList(); 
var res2 = matches 
       .Cast<Match>().Select(p => p.Groups[1].Value) // Get the whole substring 
       .ToList(); 
foreach (var coll in res1) 
    foreach (var v in coll) 
     Console.WriteLine(v); 
Console.WriteLine("Ex. 2"); 
    foreach (var v2 in res2) 
     Console.WriteLine(v2); 
1

Попробуйте следующее регулярное выражение.

Regex:(?<=\[MY_ID\] IN \()[^)]*

Объяснение:

  • (?<=\[MY_ID\] IN \() будет look behind для [MY_ID] IN (

  • [^)]* будет матч все до в ), что означает закрытие круглых скобок.

Regex101 Demo

+1

Это также приемлемый ответ, но Wiktor имел дополнительный компонент .NET, который получил меня прямой список значений, что я был в конечном счете, после того, как , – codechurn

+0

@codechurn: Я рад, что смогу помочь :-) –

Смежные вопросы