2010-04-14 2 views
0

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

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

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

Мне нужно преобразовать это с помощью регулярных выражений:

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

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

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

(Использование .NET с IgnoreWhitespace выкл и Multiline выкл)

ответ

3

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

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

Спасибо Jon ... У меня есть приложение для интрасети, которое сглаживает текст из разных источников данных, применяя замены RegEx, вытащенные из таблицы базы данных, основанные на исходном источнике. Это позволяет мне обрабатывать неактивные данные из десятков источников без перекомпиляции. У приложения есть возможность вызывать пользовательские функции, но я не использую эту функциональность там, где это возможно. Похоже, у меня может быть без выбора. – richardtallent

+0

@richardtallent: Ну, возможно, это возможно - но он чувствует себя намного проще для меня без продолжения ревкого вуду :) –

0

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

Заменить

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

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