Регулярное выражение Fill-Down - PullRequest
0 голосов
/ 15 апреля 2010

У меня есть простой текстовый файл что-то вроде этого:

Ford\tTaurus
  F-150
  F-250
Toyota\tCamry
  Corsica

Другими словами, двухуровневая иерархия, в которой первый дочерний элемент находится на той же строке, что и родительский элемент, но последующие дочерние элементы в последующих строках, отличается от родительского с помощью префикса с двумя пробелами (\t выше представляет собой буквенная вкладка в тексте).

Мне нужно преобразовать это, используя RegEx:

Ford\tTaurus
Ford\tF-150
Ford\tF-250
Toyota\tCamry
Toyota\tCorsica

Итак, мне нужно перехватить родителя (текст между \ r \ n и \ t не начинается с \ s \ s) и применить его в середине любого \r\n\s\s, найденного до следующего родителя.

У меня такое чувство, что это можно сделать с какими-то вложенными группами, но я думаю, что мне нужно больше кофеина или чего-то еще, похоже, не получается выработать схему.

(Использование .NET с выключенным IgnoreWhitespace и с выключенным мультилинием)

Ответы [ 2 ]

3 голосов
/ 15 апреля 2010

По какой конкретной причине вы хотите использовать регулярные выражения для этого? Вот код, который делает то, что я думаю, что вы хотите, не удосужившись работать с регулярными выражениями:

using System;
using System.IO;

class Test
{
    static void Main(string[] args)
    {
        string currentManufacturer = null;

        using (TextReader reader = File.OpenText(args[0]))
        using (TextWriter writer = File.CreateText(args[1]))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                string car;
                if (line.StartsWith("  "))
                {
                    if (currentManufacturer == null)
                    {
                        // Handle this properly in reality :)
                        throw new Exception("Invalid data");
                    }
                    car = line.Substring(2);
                }
                else
                {
                    string[] bits = line.Split('\t');
                    if (bits.Length != 2)
                    {
                        // Handle this properly in reality :)
                        throw new Exception("Invalid data");
                    }
                    currentManufacturer = bits[0];
                    car = bits[1];
                }
                writer.WriteLine("{0}\t{1}", currentManufacturer, car);
            }
        }
    }
}
0 голосов
/ 15 апреля 2010

Это просто (но не мудро или быстро) добиться этого с помощью регулярных выражений.

Заменить

(?<=^(Ford\t|Toyota\t).*?)^  

с $1. Убедитесь, что ^ и $ совпадают в начале / конце строки, а . соответствует символу новой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...