2014-03-06 50 views
1

我正在解析一個sgml文件。每個條目是這樣的:正則表達式 - 循環匹配

<key n=1>xzsd:test 
    <sk id=1 hi=1>test 
     <tag1>.............</tag1> 
     <tag2>.............</tag2> 
     ................ 
    </sk> 
    <sk id=2>test2 
     <tag1>.............</tag1> 
     <tag2>.............</tag2> 
     ................ 
    </sk> 
</key> 

我想用一些HTML標記來代替<key n=1>...</key>。我目前正在用標記替換標記,但只要檢索<key>標記中的所有內容可能會更有效。

我怎麼能做出這樣的代碼編譯:

entry = Regex.Replace(entry, "<key .*?>.*</key>", "<div class='key'>$2<div>");//Only interested in the second match. 
Regex skReg = new Regex(@"<sk...>", RegexOptions.Compiled); 
foreach (Match ItemMatch in ItemRegex.Matches(entry)) 
{ 
     //Do parsing of contents of each sk tag 
} 

的SGML沒有任何換行符

+0

你是開放給非正則表達式基於解決方案我想起了這個答案:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#answer-1732454 –

+0

如何?除了開始標記之外沒有什麼靜態的 – Cornwell

+1

您的正則表達式不起作用嘗試這個http://regex101.com/r/yK0mD4 – Rex

回答

2

這做工作:

  var entry = "<key n=1>xzsd:test <sk id=1 hi=1>test <tag1>.............</tag1> <tag2>.............</tag2> ................ </sk> <sk id=2>test2 <tag1>.............</tag1> <tag2>.............</tag2> ................ </sk> </key>"; 

     string pattern = "<key .*?>(.*)</key>"; 
     Match match = Regex.Match(entry, pattern); 
     while (match.Success) 
     { 
      Console.WriteLine("Found: {0}", 
           match.Groups[1].Value); //find only what is in (.*) 
      match = match.NextMatch(); 
     }