Обратный поиск в строке

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Обратный поиск в строке

Сообщение kuroi » 03.11.2011 11:41:25

Подскажите пожалуйста. Есть ли функция обратного поиска в строке. Т.е. поиск с конца строки. В функции Pos() не нашел такого параметра
kuroi
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.11.2011 14:49:40

Re: Обратный поиск в строке

Сообщение Mr.Smart » 03.11.2011 12:04:26

Смотрите модуль strutils там полно всяких функций. Допустим RPos.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Обратный поиск в строке

Сообщение NTFS » 03.11.2011 13:53:17

Вот из-за таких, как топикстартер, над паскалистами ржут все, от школьников до академиков :-)
Функция пишется за три минуты, если с автотестами - за полчаса. Примерно так:

Код: Выделить всё
function ReversePos(const substr,str:string):Integer ;
var i:Integer ;
begin
  Result:=0 ;
  for i:=Length(str) downto 1 do
    if Copy(str,i,Length(substr))=substr then begin
      Result:=Length(str)-i-Length(substr)+2 ; Break ;
    end ;
end ;


Но важно понять, что требуется от обратной функции. Позиция начала подстроки, или позиция конца подстроки?
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Обратный поиск в строке

Сообщение kuroi » 03.11.2011 15:32:56

Спасибо большое Mr.Smart .
Функцию то я написал и так. Но мне важно уменшение символов в коде программы. Так что RPos вполне подошел.
kuroi
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.11.2011 14:49:40

Re: Обратный поиск в строке

Сообщение NTFS » 03.11.2011 21:02:47

Ну только если предпочитаете стандартные функции, из пакета.. дело вкуса.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Обратный поиск в строке

Сообщение hinst » 03.11.2011 22:05:49

неужели так сложно взять и почитать документацию. Я вот не первый год пишу, всё равно периодически открываю rtl.pdf. Можно много нового и интересного узнать
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Обратный поиск в строке

Сообщение Alex2013 » 09.01.2025 23:02:24

Не совсем в тему но задач примерно таже ...
"Обрезать голову поезда" в URL
В начале
написал так
S:=S.Remove(1,S.LastIndexOf('/'));
и все сработало как надо потом возился с отладкой кода и двруг влезла лишняя буква в начале строки.
написал так
S:=S.Remove(0,S.LastIndexOf('/'));
снова все ок но мучают меня смутные сомнения ... что это было и в чем дело может быть дело ?
Alex2013
долгожитель
 
Сообщения: 3118
Зарегистрирован: 03.04.2013 11:59:44

Re: Обратный поиск в строке

Сообщение xchgeaxeax » 09.01.2025 23:29:09

Так LastIndexOf('/') для, скажем, http://localhost/images/test.png отрежет и имя папки, оставив только test.png. Вам нужен не последний /, а именно тот, что после url. Лучше использовать
что-то вроде такого
Код: Выделить всё
var
  S: String;
  i: Longint;
begin
  S := 'https://localhost/images/test.png';
  i := Pos(':', S) + 3; // Чтобы пропустить сразу и оба / после протокола
  inc(i, Pos('/', PChar(@S[i])));
  ShowMessage(PChar(@S[i]));
end.
xchgeaxeax
постоялец
 
Сообщения: 174
Зарегистрирован: 11.05.2023 03:51:40

Re: Обратный поиск в строке

Сообщение Sharfik » 09.01.2025 23:34:25

hinst писал(а):неужели так сложно взять и почитать документацию. Я вот не первый год пишу, всё равно периодически открываю rtl.pdf. Можно много нового и интересного узнать

Почитать что? Не один пакет, компонент нормального описания не имеет. В в лучших традициях nix систем - иди сам догадайся что это за динозавр.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 805
Зарегистрирован: 20.07.2013 01:04:30

Re: Обратный поиск в строке

Сообщение Alex2013 » 13.01.2025 02:04:24

xchgeaxeax писал(а):Так LastIndexOf('/') для, скажем, http://localhost/images/test.png отрежет и имя папки, оставив только test.png. Вам нужен не последний /, а именно тот, что после url.

Нет, все верно мне нужно именно "голое" имя файла ( Внешний загрузчик грузит файлы по списку URL, разумеется, можно парсить его консольный вывод и смотреть что именно но пишет на диск но это уже из серии "литературных излишеств" тем более, что этот огрызок кода кусок левой чисто тестовой процедуры (нужно отладить "оффлайн" процедуру многопоточного чтения картинок из самодельного "файлового кэш-буфера", а для этого файлы нужно без затей загрузить с сервера )
Зы
Однако там другое забавно ...
"Самая страшная ошибка та что дает ПРАВИЛЬНЫЙ результат! "(С) мой
На самом делее верно так "S :=S.Remove(0,S.LastIndexOf('/')+1);" Но файловая система забила на лишнюю косую ... ( Случайно посмотрел лог а там что-то вроде такого "X:\путь\/test.png" но фс ПОФИГ все работает как ни в чем небывало ... УПС ! :idea: :wink: )
Зы Зы
Однако все-же интересно что там с S.Remove(1,S.LastIndexOf('/')) было ведь по идее верно именно так.
Alex2013
долгожитель
 
Сообщения: 3118
Зарегистрирован: 03.04.2013 11:59:44

Re: Обратный поиск в строке

Сообщение Alexander » 13.01.2025 08:11:40

Код: Выделить всё
uses SysUtils;

begin

WriteLn(ExtractFileName('https://localhost/images/test.png'));

end.


Добавлено спустя 1 час 14 минут 36 секунд:
> Однако все-же интересно что там с S.Remove(1,S.LastIndexOf('/')) было ведь по идее верно именно так.

Ну S.LastIndexOf выдаёт правильное значение.

В документации (https://www.freepascal.org/docs-html/rt ... emove.html):

Remove removes ACount characters from the string, starting at (zero-based) index StartIndex.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 820
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Обратный поиск в строке

Сообщение Alex2013 » 13.01.2025 11:23:15

1 Мдя ! Оригинально ... :D
2 Это вроде-бы тоже понятно но вначале сработало с единицей. ( Впрочем возможно дело в том что еще раньше я делал более громоздко через copy и код тупо не перекомпилировался, но не десять же раз ряду... ) Вообщем "Варкалось. Хливкие шорьки Пырялись по наве, И глюкотали зелюки, Как мюмзики в мове." "Бармаглот" Л.Кэррола ("Алиса в Зазеркалье"): :roll:
Alex2013
долгожитель
 
Сообщения: 3118
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru