Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.10.2010, 20:01
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию Найти значения, подходящих под регулярное выражение, и записать их в массив

Имеется некий текст и регулярное выражение. Надо найти все значения, которые подходят под это регулярное выражение и записать в массив. Как это сделать?
Ответить с цитированием
  #2  
Старый 09.10.2010, 20:09
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Как вариант взять стандартную функцию поиска и замены текста и посмотреть как она работает.
Функция из строки выделяет подстроку по определённому правилу, см внутри функции, и меняет текст, т.е. работает с "подстрокой"

Функция называется StringReplace
Пример:
Код:
var
  before, after : string;

begin
  // Попытка заменить все вхождения A на THE
  before := 'This is a way to live A big life';

  after  := StringReplace(before, ' a ', ' THE ',
                          [rfReplaceAll, rfIgnoreCase]);
  ShowMessage('Before = '+before);
  ShowMessage('After  = '+after);
end;
Before = This is a way to live A big life
After = This is THE way to live THE big life

Сама функция:
Код:
function StringReplace(const S, OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;
var
  SearchStr, Patt, NewStr: string;
  Offset: Integer;
begin
  if rfIgnoreCase in Flags then
  begin
    SearchStr := AnsiUpperCase(S);
    Patt := AnsiUpperCase(OldPattern);
  end else
  begin
    SearchStr := S;
    Patt := OldPattern;
  end;
  NewStr := S;
  Result := '';
  while SearchStr <> '' do
  begin
    Offset := AnsiPos(Patt, SearchStr);
    if Offset = 0 then
    begin
      Result := Result + NewStr;
      Break;
    end;
    Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
    NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
    if not (rfReplaceAll in Flags) then
    begin
      Result := Result + NewStr;
      Break;
    end;
    SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
  end;
end;

Последний раз редактировалось Uniq!, 09.10.2010 в 20:14.
Ответить с цитированием
  #3  
Старый 09.10.2010, 20:27
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию

Uniq!, нет, не то. мне не надо замену делать.

Имеется выражение <[a-zA-Z][a-zA-Z0-9]*>, имеется текст:
Цитата:
<tag1>
Text TEXT
</tag1>

<tag222>
Текст текст
</tag222>

Получить следующий массив:
Цитата:
tag1
tag222
Ответить с цитированием
  #4  
Старый 09.10.2010, 20:44
Аватар для Sky.NET
Sky.NET Sky.NET вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 49
Версия Delphi: XE
Репутация: 12
По умолчанию

Переменной присваиваешь текст.
Ищешь тег <tag>(Pos('<tag>', S))
Ищешь тег </tag>(Pos('</tag>', S))
С позиции после <tag> до позиции </tag> копируешь в переменную/список (Copy(S, x, y))
Удаляешь всё перед </tag>, включая и его тоже, чтобы не попался при следующем поиске (Delete(S, 1, P))
И заново, т.е. цикл.

UPD
Или тебе нужно записать все встречающиеся теги?
__________________
IDE := Embarcadero.RADStudio.XE.Architect
// Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук ©

Последний раз редактировалось Sky.NET, 09.10.2010 в 20:50.
Ответить с цитированием
  #5  
Старый 09.10.2010, 21:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, похоже на xml/html. Для этого возиться с RegExp'ами совершенно не обязательно. Если у тебя реально wellformed xml, то можно воспользоваться TXMLDocument и потом просто пройтись по узлам. Если нет, то можно воспользоваться MS HTML парсером.
Ответить с цитированием
  #6  
Старый 09.10.2010, 21:32
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Или тебе нужно записать все встречающиеся теги?
Да, как получить содержимое внутри тегов я знаю. Теперь надо получить список тегов.

Цитата:
Вообще, похоже на xml/html. Для этого возиться с RegExp'ами совершенно не обязательно. Если у тебя реально wellformed xml, то можно воспользоваться TXMLDocument и потом просто пройтись по узлам. Если нет, то можно воспользоваться MS HTML парсером.
По сути это и есть HTML. Сначала хотел использовать XML, но геморойно как и размечать так и парсить. Потом JSON - тоже геморойно парсить. Решил с помощью своих тегов размечать...
Ответить с цитированием
  #7  
Старый 09.10.2010, 22:20
Аватар для Sky.NET
Sky.NET Sky.NET вне форума
Прохожий
 
Регистрация: 22.09.2010
Сообщения: 49
Версия Delphi: XE
Репутация: 12
По умолчанию

Ну собственно найти теги можно также, только
первым находить '</', т.к. '<' присутствует и в отрывающем и в закрывающем теге, и вторым '>'. И если в списке нет найденного тега, добавить в список.
__________________
IDE := Embarcadero.RADStudio.XE.Architect
// Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук ©
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter