2014-01-06 142 views
1

我有結構[HEADER].{3}$[.FOOTER]正則表達式到括號不匹配的字符串

我需要閱讀這個配置並準備一個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} $是需要應用於標題的正則表達式。基本上[]之間的任何東西都是一個值,休息是一個正則表達式。 – 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" ] 

*編輯* 對於收集組內容多個實例,你可以試試這個

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

如果字符串限制爲3組,那麼這肯定會起作用。我可能會輸入一個[HEADER]。{3} $ [。FOOTER] [。HEADER2]。{2} $ [。FOOTER2] – Cannon

+0

好的,編輯後可以提供更好的答案。 –

+0

如果我只想解析它只有兩種類型,該怎麼辦?價值或模式。帶[]的是一個值,另一個是一個模式。因爲這將更加可重用。像這樣說:「[value]。{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, @"(?<=(\]|^))[^\]]+?(?=\[|$)");