Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, регулярные выражения 
:(
    Опции темы
Gangleon
Дата 1.6.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Помогите составить регулярное выражение, у меня не выходит.

Есть строка, например: 
Много-много текста в стрке ++index еще текст i++ еще текст GetDocManager()->MatchTemplate = 0

Отсюда надо изъять в одну переменную ++index, в другую i++, в третью GetDocManager()->MatchTemplate.
Лучше это делать в разных наверно проверках, так как кроме этих случаев есть множество аналогичных.

Спасибо)
PM MAIL   Вверх
nitr
Дата 1.6.2008, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Gangleon, пример приведите "из жизни".


--------------------
PM   Вверх
Gangleon
Дата 1.6.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Это и был реальный пример. если конкретней - у меня есть прога на C++, для которой нужно написать парсер, который будет выводить все "двусимвольные" операции, типа ++, -> и тогдалее.
PM MAIL   Вверх
nitr
Дата 1.6.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Я просил показать, что вы хотите "парсить" (исходные данные).
А так по теме выходит не очень впечатляющий код ;)
Код
#!perl
use warnings;
use strict;

my $str = 'text ++index text i++ text GetDocManager()->MatchTemplate = 0';
my $a1 = qr{\Q++index\E};
my $a2 = qr{\Qi++\E};
my $a3 = qr{\QGetDocManager()->MatchTemplate\E};
$str =~ /.*?($a1).*?($a2).*?($a3)/ig;
print "$1\n$2\n$3";


Это сообщение отредактировал(а) nitr - 1.6.2008, 22:49


--------------------
PM   Вверх
Gangleon
Дата 1.6.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Спасибо, но это все не то. Мне надо другое  - есть например текст.

        devName = printDevice;
        while (*printDevice) {
          if (*printDevice == ',') {
            *printDevice++ = 0;
            if (!driverName)
              driverName = printDevice;
            else
              outputName = printDevice;
          }
          else
            printDevice = ::AnsiNext(printDevice);
        }

        if (Printer->GetSetup().Error != 0                ||
            strcmp(devName, Printer->GetSetup().GetDeviceName()) != 0  ||
            strcmp(driverName, Printer->GetSetup().GetDriverName()) != 0 ||
            strcmp(outputName, Printer->GetSetup().GetOutputName()) != 0 ) {
          // New printer installed so get the new printer device now.
          //
          delete Printer;
          Printer = new TPrinter(this);
        }
      }
      else {
        // No printer installed(GetProfileString failed).
        //
        delete Printer;
        Printer = new TPrinter(this);
      }
    }
  }

От сюда надо вытащить все операторы - например все операции казательно ++ - результатом должен вывестись  *printDevice++, Для оператора -> : 
Printer->GetSetup().GetDeviceName()
Printer->GetSetup().GetDriverName()
Printer->GetSetup().GetOutputName()

В этом вся сложность - что мы не знаем что стоит справа и слева.

PM MAIL   Вверх
nitr
Дата 2.6.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Вариантов много, вот одно из них:
Код
#!perl
use warnings;
use strict;

my $str = <<SOURCE;
        devName = printDevice;
        while (*printDevice) {
          if (*printDevice == ',') {
            *printDevice++ = 0;
            if (!driverName)
              driverName = printDevice;
            else
              outputName = printDevice;
          }
          else
            printDevice = ::AnsiNext(printDevice);
        }

        if (Printer->GetSetup().Error != 0                ||
            strcmp(devName, Printer->GetSetup().GetDeviceName()) != 0  ||
            strcmp(driverName, Printer->GetSetup().GetDriverName()) != 0 ||
            strcmp(outputName, Printer->GetSetup().GetOutputName()) != 0 ) {
          // New printer installed so get the new printer device now.
          //
          delete Printer;
          Printer = new TPrinter(this);
        }
      }
      else {
        // No printer installed(GetProfileString failed).
        //
        delete Printer;
        Printer = new TPrinter(this);
      }
    }
  }

SOURCE

my $a1 = qr{\S+\+\+};
my $a2 = qr{\S+->\S+};
while($str =~ /($a1)/smg) {
    print "$1\n";
}
while($str =~ /($a2)/smg) {
    print "$1\n";
}



--------------------
PM   Вверх
Gangleon
Дата 2.6.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Nitr, огромное спасибо! Ты гений^_^
PM MAIL   Вверх
nitr
Дата 2.6.2008, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: нет
Всего: 84



Gangleon, спасибо, но ничего гениального нет smile
Этот код можно улучшить и "преобразить" - идею я вам подал...


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.