![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Имеется некий текст и регулярное выражение. Надо найти все значения, которые подходят под это регулярное выражение и записать в массив. Как это сделать?
|
|
#2
|
||||
|
||||
|
Как вариант взять стандартную функцию поиска и замены текста и посмотреть как она работает.
Функция из строки выделяет подстроку по определённому правилу, см внутри функции, и меняет текст, т.е. работает с "подстрокой" Функция называется 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
|
|||
|
|||
|
Uniq!, нет, не то. мне не надо замену делать.
Имеется выражение <[a-zA-Z][a-zA-Z0-9]*>, имеется текст: Цитата:
Получить следующий массив: Цитата:
|
|
#4
|
||||
|
||||
|
Переменной присваиваешь текст.
Ищешь тег <tag>(Pos('<tag>', S)) Ищешь тег </tag>(Pos('</tag>', S)) С позиции после <tag> до позиции </tag> копируешь в переменную/список (Copy(S, x, y)) Удаляешь всё перед </tag>, включая и его тоже, чтобы не попался при следующем поиске (Delete(S, 1, P)) И заново, т.е. цикл. UPD Или тебе нужно записать все встречающиеся теги? Последний раз редактировалось Sky.NET, 09.10.2010 в 20:50. |
|
#5
|
|||
|
|||
|
Вообще, похоже на xml/html. Для этого возиться с RegExp'ами совершенно не обязательно. Если у тебя реально wellformed xml, то можно воспользоваться TXMLDocument и потом просто пройтись по узлам. Если нет, то можно воспользоваться MS HTML парсером.
|
|
#6
|
|||
|
|||
|
Цитата:
Цитата:
|
|
#7
|
||||
|
||||
|
Ну собственно найти теги можно также, только
первым находить '</', т.к. '<' присутствует и в отрывающем и в закрывающем теге, и вторым '>'. И если в списке нет найденного тега, добавить в список. |