|
|
Регистрация | << Правила форума >> | 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 Или тебе нужно записать все встречающиеся теги? IDE := Embarcadero.RADStudio.XE.Architect // Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук © Последний раз редактировалось Sky.NET, 09.10.2010 в 20:50. |
#5
|
|||
|
|||
Вообще, похоже на xml/html. Для этого возиться с RegExp'ами совершенно не обязательно. Если у тебя реально wellformed xml, то можно воспользоваться TXMLDocument и потом просто пройтись по узлам. Если нет, то можно воспользоваться MS HTML парсером.
|
#6
|
|||
|
|||
Цитата:
Цитата:
|
#7
|
||||
|
||||
Ну собственно найти теги можно также, только
первым находить '</', т.к. '<' присутствует и в отрывающем и в закрывающем теге, и вторым '>'. И если в списке нет найденного тега, добавить в список. IDE := Embarcadero.RADStudio.XE.Architect // Успешность метода научного тыка обратно пропорциональна извилистости головного мозга на кривизну рук © |