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

Статус
В этой теме нельзя размещать новые ответы.

alexmir

Постоялец
Регистрация
4 Дек 2006
Сообщения
118
Реакции
18
Добрый день! помогите доделать регулярку, собщем есть вде строки
ABU GARSIA / Спиннинг / CARP
BALSAX / Груз
суть надо вытащить в массив отдельно первые и вторые записи, если я их пытаюсь вытащить таким образом ([^"]*)/ ([^"]*)/, то во второй строчке ничего не вытаскивает. Заранее всем спасибо.
 
1-ые строки
(.*/.*/.*[^s])
2-ые строки
.*/.*/.*[^s](?s)([^s]*/.*)
 
Что-то типа этого:
Код:
(.*?)\s*/\s*(.*?)\s*(?:[/\r\n]|$)
 
Сложно сказать, что именно делфи не понравилось. Попробуйте еще такой вариант:
Код:
(.*?)\s*/\s*(.*?)\s*[/\r\n]

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

Только если последний рядок будет состоять из 2 элементов - тогда регулярка его не захватит
Так и есть, если из двух элементов то не прохавывает
 
В каком виде вы делаете обработку: построчно, или запускаете регулярку для одного большого текста? (если можно, то покажите кусок кода из программы, это значительно облегчит написание правильной регулярки)
 
Обработка происходит построчно, считываю из экселевского файла данные построчно

Код:
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];
 
Ну если построчно, тогда проще всего добавлять в конце каждой строки слеш (если делфи матерится на регулярку с $) примерно так:
Код:
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;

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