2010-07-01 3 views
0

Как я могу разобрать следующий контент?Регулярное выражение # 2

data (DIR1:input bit; 
     DGG2:input bit; 
     OENEG1:input bit; 
     OE_NEG2:input bit; 
     A1:inputoutput bit_vector(1 to 9); 
     A2,H5,J7:inputoutput bit_vector(1 to 9); 
     B1,E4,Y7:inputoutput bit_vector(1 to 9); 
     B2:inputoutput bit_vector(1 to 9); 
       TGY:output bit; 
     THHH, Tff, TsD:input bit); 

Я хочу вывод в словаре, который показан ниже

Dictionary<string,string> l_dictData = new Dictionary<string,string>(); 

После разбора l_dictData должен быть заполнен результатом:

l_dictData["inputbit"] = "DIR1,DGG2,OENEG1,OE_NEG2,THHH,Tff,TsD"; 

l_dictData["inputoutputbit"] = "A1(1),A1(2),....,A1(9)A2(1),A2(2)....A2(9),H5(1)....H5(9),J7(1),...J7(9),B1(1),....B1(9),E4(1),....E4(9),Y7(1),...Y7(9),B2(1),....B2(9)"; 

l_dictData["outputbit"] = "TGY"; 

Вот мой Regular Expression

1. ([ \t\r\n]*)?(data|DATA)([ \t\r\n]*)?(\()? 
    2. "[ \t\r\n]*(?<PINFUNC>(inputbit|outputbit|inputoutputbit))(_vector[ \t\r\n]*\([ \t\r\n]*(?<START>([0-9]+))[ \t\r\n]*(to|downto)[ \t\r\n]*(?<END>([0-9]+))[ \t\r\n]*\))? 

Примечание:

Текст перед «:» (двоеточие Semi берется в качестве значения для словаря)

Пожалуйста, дайте мне знать, если у вас есть вопросы

ответ

4

я бы не использовать обычные выражения. Я бы сделал следующее:

  1. Отфильтровать содержимое кронштейнов.
  2. Разделите свою строку; для получения индивидуальных ценностей.
  3. Создание объекта холдинга, которое коснуться как dictionary<string,list<string>>
  4. Петля через каждый из ваших имя/значение вещей (например, «DIR1: входной бит») и разделить на:
  5. Разработайте ваш ключ и значение (Ваши ключи Дон Кажется, что точно соответствует тому, что есть после «:»
  6. Если ключ находится в словаре, то добавьте значение в список, если ключ еще не существует, тогда вам нужно сначала создать список строк.
  7. Финишный цикл с вашим словарем, ссылающимся на списки значений.
  8. Прокрутите свой новый словарь и напишите значения в в ваш последний словарь, просто переведя список в одну строку.
  9. Прибыль.

О, и вам может понадобиться какая-нибудь отделка(), чтобы справиться с вашими пробелами.

+0

+1 Regex может быть в лучшем случае используется на пару шагов, упомянутых здесь. Я говорю много шагов, чтобы получить прибыль. – Amarghosh

+0

Это тот же самый угол, на который я бы атаковал проблему. Я, вероятно, в конечном итоге сделаю это с помощью TDD, поэтому я не уверен, как будет выглядеть окончательное решение, но я не думаю, что начну с регулярного выражения. – ckramer

1

Это выражение: (?:\(|\s)\s*([\w| |,]*):(\w*?) bit.*?;

дает следующие результаты:

[1] => Array 
    (
     [0] => DIR1 
     [1] => DGG2 
     [2] => OENEG1 
     [3] => OE_NEG2 
     [4] => A1 
     [5] => A2,H5,J7 
     [6] => B1,E4,Y7 
     [7] => B2 
     [8] => TGY 
     [9] => THHH, Tff, TsD 
    ) 

[2] => Array 
    (
     [0] => input 
     [1] => input 
     [2] => input 
     [3] => input 
     [4] => inputoutput 
     [5] => inputoutput 
     [6] => inputoutput 
     [7] => inputoutput 
     [8] => output 
     [9] => input 
    ) 

Split на запятые, обрезать пробелы, добавить "бит" к ключу, и вы сделали.

С благодарностью My Regex Tester (который также будет объяснить это, если вы спросите его): http://www.myregextester.com/index.php

+0

Колдовство я говорю! +1 –

+0

'[\ w | |,] '-' '' не является метасимволом в определении класса символов. – polygenelubricants

+0

Meh, независимо от того, что означает «или» в версии C#. – Lunivore

Смежные вопросы