2014-01-06 2 views
1

У меня есть конфигурация, как [HEADER].{3}$[.FOOTER]Regex чтобы соответствовать строке НЕ в скобках

Мне нужно прочитать этот конфиг и подготовить 2-D массив, где строка между [] значением и строка без [] является регулярным выражением для применяется.

Как расколоть эту строку, чтобы получить этот массив.

Идея получить:

IsRegEx Value 
0  [HEADER] 
1  .{3}$ 
0  [.FOOTER] 

Так что я могу применить регулярное выражение index-1th значения и массива Concat обратно привести строку.

Я попытался с помощью

string input = "[HEADER].{3}$[.FOOTER]"; 
char[] delimiterChars = { '[', ']'}; 
string[] words = input.Split(delimiterChars); 

Но что снимает [], и нет никакого способа налево, то различие между фактическим значением и регулярных выражений шаблона в заданной строке.

string[] parts = Regex.Split(input , @"(?<=[.,;])") может работать, если разделитель был .,;

+0

Любые попытки еще? – Jerry

+0

'[HEADER]. {3} $ [. FOOTER]' является регулярным выражением или вашей реальной входной строкой? –

+0

Его строка ввода, где. {3} $ - регулярное выражение, которое необходимо применить к заголовку. В основном что-то между [] является значением, а rest - регулярным выражением. – Cannon

ответ

0

Вы можете использовать этот пример:

string input = "[HEADER].{3}$[.FOOTER]"; 
Regex rx = new Regex(@"(?<header>\[.*\])(?<body>.*)(?<footer>\[.*\])"); 
Match m = rx.Match(input); 

Затем соберите содержимое группы с

m.Groups[ "header" ] 
m.Groups[ "body" ] 
m.Groups[ "footer" ] 

* EDIT * Для несколько экземпляров, вы можете попробовать это

string input = "[HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]"; 
    Regex rx = new Regex(@"\G(?<header>\[[^]]*?\])(?<body>[^[]*?)(?<footer>\[[^]]*?\])", RegexOptions.Multiline); 
    Match m = rx.Match(input);  
    while(m.Success) 
    { 
    m = m.NextMatch(); 
    } 
+0

Это будет работать, если строка ограничена тремя группами. У меня может быть вход как [HEADER]. {3} $ [. FOOTER] [. HEADER2]. {2} $ [. FOOTER2] – Cannon

+0

Хорошо, отредактирован, чтобы дать лучший ответ. –

+0

Что делать, если я просто хочу разобрать его только двумя типами. Значение или шаблон. Значение с [] является значением, другое - шаблоном. Поскольку это будет более многоразовым. Скажем так: «[значение]. {3} $ [. Value] [. Value]. {2} $ [. Value]"; – Cannon

0

Это регулярное выражение будет найти любое количество вашего заголовка и колонтитулы значений (если у вас нет ничего слишком сложного, как вложенных или сбежавших скобки):

var input = "[HEADER].{3}$[.FOOTER][.HEADER2].{2}$[.FOOTER2]"; 
var headersAndFooters = Regex.Matches(input, @"\[.*?\]"); 

Затем вы можете вычислить, что между ними, используя индексы и длины совпадений (например, в приведенном выше примере зазоры от 8 до 13 являются первым регулярным выражением) или это регулярное выражение:

var regexes = Regex.Matches(input, @"(?<=(\]|^))[^\]]+?(?=\[|$)"); 
Смежные вопросы