Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

составить Pattern(RegExp)


dmitry1991 ©   (2009-06-22 16:58:00) 

задача в следующем:

имеется список строк вида:
'Палатка туристическая Nova Tour Тайга 4 км N'    ''    '1636'    '0'
'Палатка туристическая Nova Tour Тайга 4 N'    ''    '1636'    '0'
'Ракетка теннисная'    ''    '2015'    '0'
'Шахматы пластиковые на магнитах'    ''    '1991'    '0'
'Шахматы 25x25 дерево'    ''    '1991'    '0'
'Шахматы 25x25 пластиковые на магнитах'    ''    '1991'    '0'
Необходимо извлечь 4 составляющие строки, значения в одинарных кавычках (значения разделены между собой символом табуляции).Помогите составить корректное условие поиска (Pattern).


Медвежонок Пятачок   (2009-06-22 17:32:00) [1]

SplitRegExpr(#9,MyString,MyStringList);


dmitry1991   (2009-06-22 17:29:00) [2]


> Юрий Зотов ©   (22.06.09 17:17) [5]
> > Palladin ©   (22.06.09 17:12) [4]Мне тоже кажется, что
> привлечение регвыражений для такой простенькой задачки -
>  это стрельба из пушки по воробьям.


Так-то оно так... но в моем случае препод требует сделать именно с использованием RegExp. Уже несколько часов пытаюсь составить выражение - ничего не выходит.


Palladin   (2009-06-22 17:23:00) [3]

Мне тоже, причем очень сильно, отсюда и пример без использования тяжелой артиллерии )

А так же, в случае использования  Делфи ниже 2009, рекомендую аффтору использовать следующую функцию:

Function vtPos(Const SS,S:String;p_nFrom:Integer=1):Integer;
Var
 nSLen,nSSLen,i,c:Integer;
Begin
 Result:=0;
 nSSLen:=Length(ss);
 nSLen:=Length(s);
 If (nSSLen=0) or (nSLen=0) or (p_nFrom=0) Then Exit;
 If p_nFrom>0 Then
  Begin
   c:=1;
   For i:=p_nFrom to nSLen Do
    If s[i]=ss[c] Then
     Begin
      Inc(c);
      If c=nSSLen+1 Then
       Begin
        Result:=i-c+2;
        Break;
       End;
     End Else c:=1;
  End Else
  Begin
   p_nFrom:=nSLen+p_nFrom+1;
   c:=nSSLen;
   For i:=p_nFrom Downto 1 Do
    If s[i]=ss[c] Then
     Begin
      Dec(c);
      If c=0 Then
       Begin
        Result:=i;
        Break;
       End;
     End Else c:=nSSLen;
  End;
End;


Palladin   (2009-06-22 17:23:00) [4]

вместо шататной функции PosEx из D7


Юрий Зотов   (2009-06-22 17:17:00) [5]

> Palladin ©   (22.06.09 17:12) [4]

Мне тоже кажется, что привлечение регвыражений для такой простенькой задачки - это стрельба из пушки по воробьям.


Palladin   (2009-06-22 17:12:00) [6]

Var
ss:TStringList;
n,m:Integer;

ss:=TStringList.Create;
Try
 n:=Pos(#9,s); m:=1;
 While n<>0 Do
  Begin
   ss.Add(Copy(s,m,n-1); m:=n+1;
   n:=PosEx(#9,s,m);
  End;
 ss.Add(Copy(s,m,Length(s));
Finally
ss.Free;
End;


Медвежонок Пятачок   (2009-06-22 17:08:00) [7]

Меnод Split.
Аргументами входная строка, шаблон-разделитель (табуляция), и экземпляр списка куда все это засовывать


dmitry1991   (2009-06-22 17:05:00) [8]

можете набросать пример, впервые сталкиваюсь с regexp


Медвежонок Пятачок   (2009-06-22 17:00:00) [9]

засплиттить всю строку целиком в список по символу табуляции и все


Наверх

Титульная страница Поиск, карта сайта Написать письмо