2010-11-22 10 views
0

Windowsのテキストファイルを解析し、操作に関連するすべてのデータを抽出する必要があります。操作 は、$ OPERATIONと$ OPERATION_ENDで区切られています。私がする必要があるのは、すべての操作のすべてのテキストブロックを抽出することです。正規表現または単純なStringメソッドを使用して、効果的に行うにはどうすればよいですか? 私は小さなスニペットを提供していただければ幸いです。オープンクローズタグによるテキストの解析

$OPERS_LIST 
//some general data 

$OPERATION 
//some text block 
$OPERATION_END 


$OPERS_LIST_END 

答えて

1

リストからすべての操作を取得する:

var input = @"$OPERS_LIST 
//some general data 

$OPERATION 

erfgergwerg 
ewrg//some text block 

$OPERATION_END 

$OPERATION 
//some text block 
$OPERATION_END 


$OPERATION 
//some text block 
$OPERATION_END 


$OPERS_LIST_END"; 
foreach (Match match in Regex.Matches(input, @"(?s)\$OPERATION(?<op>.+?)\$OPERATION_END")) 
{ 
var operation = match.Groups["op"].Value; 

// do something with operation... 
} 
1
try { 
    if (Regex.IsMatch(subjectString, @"\$OPERATION(.*?)\$OPERATION_END", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace)) { 
     // Successful match 
    } else { 
     // Match attempt failed 
    } 
} catch (ArgumentException ex) { 
    // Syntax error in the regular expression 
} 
1

このような拡張メソッドを試してみてください。あなたが読んでいるファイルに対応するTextReaderを渡してください。

public static IEnumerable<string> ReadOperationsFrom(this TextReader reader) 
{ 
    if (reader == null) 
     throw new ArgumentNullException("reader"); 

    string line; 
    bool inOperation = false; 

    var buffer = new StringBuilder(); 

    while ((line = reader.ReadLine()) != null) { 
     if (inOperation) { 
      if (line == "$OPERATION") 
       throw new InvalidDataException("Illegally nested operation block."); 

      if (line == "$OPERATION_END") { 
       yield return buffer.ToString(); 

       buffer.Length = 0; 
       inOperation = false; 
      } else { 
       buffer.AppendLine(line); 
      } 
     } else if (line == "$OPERATION") { 
      inOperation = true; 
     } 
    } 

    if (inOperation) 
     throw new InvalidDataException("Unterminated operation block."); 
} 
関連する問題