Разбор текста с открытыми тегами закрытия - PullRequest
0 голосов
/ 22 ноября 2010

Мне нужно разобрать текстовый файл Windows и извлечь все данные, связанные с операциями. операции разделяются $ OPERATION и $ OPERATION_END. Что мне нужно сделать, это извлечь все текстовые блоки для всех операций. Как я могу сделать это эффективно используя регулярные выражения или простые методы String. Буду признателен, если вы предоставите небольшой фрагмент кода.

$OPERS_LIST
//some general data

$OPERATION
//some text block
$OPERATION_END


$OPERS_LIST_END

Ответы [ 3 ]

1 голос
/ 22 ноября 2010

Попробуйте метод расширения, подобный этому.Просто введите 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.");
}
1 голос
/ 22 ноября 2010

чтобы получить все операции из списка:

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 голос
/ 22 ноября 2010
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
}
...