Поиск групп разделенных слешем

Тема в разделе "Регулярные выражения", создана пользователем alexmir, 2 ноя 2012.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. alexmir

    alexmir Постоялец

    Регистр.:
    4 дек 2006
    Сообщения:
    117
    Симпатии:
    18
    Добрый день! помогите доделать регулярку, собщем есть вде строки
    ABU GARSIA / Спиннинг / CARP
    BALSAX / Груз
    суть надо вытащить в массив отдельно первые и вторые записи, если я их пытаюсь вытащить таким образом ([^"]*)/ ([^"]*)/, то во второй строчке ничего не вытаскивает. Заранее всем спасибо.
     
  2. Leony

    Leony

    Регистр.:
    18 мар 2008
    Сообщения:
    153
    Симпатии:
    25
    1-ые строки
    (.*/.*/.*[^s])
    2-ые строки
    .*/.*/.*[^s](?s)([^s]*/.*)
     
  3. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Что-то типа этого:
    Код:
    (.*?)\s*/\s*(.*?)\s*(?:[/\r\n]|$)
     
  4. alexmir

    alexmir Постоялец

    Регистр.:
    4 дек 2006
    Сообщения:
    117
    Симпатии:
    18
    Чето ругается на неправильный модификатор. Регулярку в делфи использую.
     
  5. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Сложно сказать, что именно делфи не понравилось. Попробуйте еще такой вариант:
    Код:
    (.*?)\s*/\s*(.*?)\s*[/\r\n]
    Только если последний рядок будет состоять из 2 элементов - тогда регулярка его не захватит
     
  6. alexmir

    alexmir Постоялец

    Регистр.:
    4 дек 2006
    Сообщения:
    117
    Симпатии:
    18
    Так и есть, если из двух элементов то не прохавывает
     
  7. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    В каком виде вы делаете обработку: построчно, или запускаете регулярку для одного большого текста? (если можно, то покажите кусок кода из программы, это значительно облегчит написание правильной регулярки)
     
  8. alexmir

    alexmir Постоялец

    Регистр.:
    4 дек 2006
    Сообщения:
    117
    Симпатии:
    18
    Обработка происходит построчно, считываю из экселевского файла данные построчно

    Код:
    begin
      if OpenDialog1.Execute then
      fn:=OpenDialog1.FileName;
      XL:=CreateOLEObject('Excel.Application');
      XL.Workbooks.Open(fn);
      ExSheet:=XL.WorkSheets[1];
      r := TRegExpr.Create;
      r.Expression:='(.*?)\s*/\s*(.*?)\s*[/\r\n]';
      progressbar1.Visible:=true;
      progressbar1.Min:=0;
      progressbar1.Max:=ExSheet.UsedRange.Rows.Count;
      j:=ExSheet.UsedRange.Rows.Count-1;
      for i := 1 to j do
      begin
    q1:='';
    q2:='';
    q3:='';
      If XL.Range[XL.Cells[i,1],XL.Cells[i,1]].MergeCells Then
      begin
      Kat:='';
      m:='';
      Kat:=XL.Range[XL.Cells[i,1],XL.Cells[i,1]];
      if r.Exec(kat) then
      begin
      m:=r.Match[1];
      k1:=r.Match[2];
      end;
      if Kat='' then
      begin
        continue;
      end
      else
      if Kat<>'' then
      continue;
      end
      else
        q1:=XL.Cells[i,2];
        q2:=XL.Cells[i,3];
        q3:=XL.Cells[i,5];
        q4:=XL.Cells[i,6];
    
     
  9. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Ну если построчно, тогда проще всего добавлять в конце каждой строки слеш (если делфи матерится на регулярку с $) примерно так:
    Код:
    Kat:=XL.Range[XL.Cells[i,1],XL.Cells[i,1]] + '/';
    И использовать эту регулярку:
    И если не против, то пару замечаний к вашему коду:
    1. Так писать плохая манера:
    Код:
    if OpenDialog1.Execute then
      fn:=OpenDialog1.FileName;
    Если нажмут отмена, то переменная fn будет не определенна и функция продолжит свою работу, что в результате вызовет ошибку

    2. Переменная r создается, но не видно где освобождается память. Утечки памяти - это большое зло. К тому же настоятельно рекомендую пользоваться блоками try ... finaly

    3. Этот кусок кода точно правильно написан?
    Код:
    else
        q1:=XL.Cells[i,2];
        q2:=XL.Cells[i,3];
        q3:=XL.Cells[i,5];
        q4:=XL.Cells[i,6];
    Такое чувство, что не хватает begin ... end;

    Ну и настоятельно рекомендую приучать себя к правильным отступам, всё равно потом сами себя будете переучивать, а свой старый код после этого читать будет очень не приятно.
     
    alexmir нравится это.
Статус темы:
Закрыта.