Обратный поиск в строке
Модератор: Модераторы
Обратный поиск в строке
Подскажите пожалуйста. Есть ли функция обратного поиска в строке. Т.е. поиск с конца строки. В функции Pos() не нашел такого параметра
Смотрите модуль strutils там полно всяких функций. Допустим RPos.
-
NTFS
- постоялец
- Сообщения: 388
- Зарегистрирован: 05.11.2007 13:57:50
- Откуда: Краснодар
- Контактная информация:
Вот из-за таких, как топикстартер, над паскалистами ржут все, от школьников до академиков 
Функция пишется за три минуты, если с автотестами - за полчаса. Примерно так:
Но важно понять, что требуется от обратной функции. Позиция начала подстроки, или позиция конца подстроки?
Функция пишется за три минуты, если с автотестами - за полчаса. Примерно так:
Код: Выделить всё
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 ;
Но важно понять, что требуется от обратной функции. Позиция начала подстроки, или позиция конца подстроки?
Спасибо большое Mr.Smart .
Функцию то я написал и так. Но мне важно уменшение символов в коде программы. Так что RPos вполне подошел.
Функцию то я написал и так. Но мне важно уменшение символов в коде программы. Так что RPos вполне подошел.
неужели так сложно взять и почитать документацию. Я вот не первый год пишу, всё равно периодически открываю rtl.pdf. Можно много нового и интересного узнать
Не совсем в тему но задач примерно таже ...
"Обрезать голову поезда" в URL
В начале
написал так
S:=S.Remove(1,S.LastIndexOf('/'));
и все сработало как надо потом возился с отладкой кода и двруг влезла лишняя буква в начале строки.
написал так
S:=S.Remove(0,S.LastIndexOf('/'));
снова все ок но мучают меня смутные сомнения ... что это было и в чем дело может быть дело ?
"Обрезать голову поезда" в URL
В начале
написал так
S:=S.Remove(1,S.LastIndexOf('/'));
и все сработало как надо потом возился с отладкой кода и двруг влезла лишняя буква в начале строки.
написал так
S:=S.Remove(0,S.LastIndexOf('/'));
снова все ок но мучают меня смутные сомнения ... что это было и в чем дело может быть дело ?
-
xchgeaxeax
- постоялец
- Сообщения: 207
- Зарегистрирован: 11.05.2023 02:51:40
Так 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.Почитать что? Не один пакет, компонент нормального описания не имеет. В в лучших традициях nix систем - иди сам догадайся что это за динозавр.hinst писал(а):неужели так сложно взять и почитать документацию. Я вот не первый год пишу, всё равно периодически открываю rtl.pdf. Можно много нового и интересного узнать
Нет, все верно мне нужно именно "голое" имя файла ( Внешний загрузчик грузит файлы по списку URL, разумеется, можно парсить его консольный вывод и смотреть что именно но пишет на диск но это уже из серии "литературных излишеств" тем более, что этот огрызок кода кусок левой чисто тестовой процедуры (нужно отладить "оффлайн" процедуру многопоточного чтения картинок из самодельного "файлового кэш-буфера", а для этого файлы нужно без затей загрузить с сервера )xchgeaxeax писал(а): Так LastIndexOf('/') для, скажем, http://localhost/images/test.png отрежет и имя папки, оставив только test.png. Вам нужен не последний /, а именно тот, что после url.
Зы
Однако там другое забавно ...
"Самая страшная ошибка та что дает ПРАВИЛЬНЫЙ результат! "(С) мой
На самом делее верно так "S :=S.Remove(0,S.LastIndexOf('/')+1);" Но файловая система забила на лишнюю косую ... ( Случайно посмотрел лог а там что-то вроде такого "X:\путь\/test.png" но фс ПОФИГ все работает как ни в чем небывало ... УПС !
Зы Зы
Однако все-же интересно что там с S.Remove(1,S.LastIndexOf('/')) было ведь по идее верно именно так.
- Alexander
- энтузиаст
- Сообщения: 880
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
Код: Выделить всё
uses SysUtils;
begin
WriteLn(ExtractFileName('https://localhost/images/test.png'));
end.
> Однако все-же интересно что там с 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.
1 Мдя ! Оригинально ...
2 Это вроде-бы тоже понятно но вначале сработало с единицей. ( Впрочем возможно дело в том что еще раньше я делал более громоздко через copy и код тупо не перекомпилировался, но не десять же раз ряду... ) Вообщем "Варкалось. Хливкие шорьки Пырялись по наве, И глюкотали зелюки, Как мюмзики в мове." "Бармаглот" Л.Кэррола ("Алиса в Зазеркалье"):
2 Это вроде-бы тоже понятно но вначале сработало с единицей. ( Впрочем возможно дело в том что еще раньше я делал более громоздко через copy и код тупо не перекомпилировался, но не десять же раз ряду... ) Вообщем "Варкалось. Хливкие шорьки Пырялись по наве, И глюкотали зелюки, Как мюмзики в мове." "Бармаглот" Л.Кэррола ("Алиса в Зазеркалье"):
