Регулярное выражение № 2 - PullRequest
0 голосов
/ 01 июля 2010

Как я могу разобрать следующий контент?

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";

Вот мое регулярное выражение

    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]*\))?

Примечание:

Текст перед ":" (в качестве значения словаря используется точка с запятой)

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

Ответы [ 2 ]

4 голосов
/ 01 июля 2010

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

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

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

1 голос
/ 01 июля 2010

Это выражение: (?:\(|\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
    )

Разделите запятые, обрежьте пробелы, добавьте «бит» к клавише, и все готово.

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

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