Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2015, 18:56   #1
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию Аналог функции

В своё время я написал такую функцию

Код:

function shearPosString(const PosA, PosB, str: string): AnsiString;
  function PosAString(const SubStr, s: string; last: Boolean = false): String;
  var
    LenA, LenB, SubStrLen: Integer;
    B: Boolean;
  begin
    SubStrLen := SubStr.Length;
    LenA := s.Length;
    Result := s;
    if last then
    begin
      while (LenA > 0) and (not B) do
      begin
        B := Copy(s, LenA, SubStrLen) = SubStr;
        if B then
          delete(Result, LenA, Result.Length);
        Dec(LenA);
      end;
    end
    else
    begin
      LenB := 0;
      while (LenB <> LenA) and (not B) do
      begin
        B := Copy(s, LenB, SubStrLen) = SubStr;
        if B then
        begin
          if SubStrLen <> 1 then
            LenB := LenB + SubStrLen;

          delete(Result, 1, LenB);
        end;
        inc(LenB);
      end;
    end;
  end;

begin
  Result := AnsiString(PosAString(PosB, PosAString(PosA, str), true));
end;

Есть ли аналог этой функции в самой Delphi(XE7) ? И вдруг как-то можно упростить....


Пример того что она делает
Код:
 shearPosString('xxx_e', '.xxx', 'xxx_efewg.xxx') - будет fewg

Последний раз редактировалось Stilet; 10.07.2015 в 19:24.
Должно быть имя? вне форума Ответить с цитированием
Старый 10.07.2015, 19:24   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть ли аналог этой функции в самой Delphi(XE7) ?
Регулярные выражения. А чем эта функция неугодила?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.07.2015, 19:28   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
result:='xxx_efegw.xxx';
result:=StringReplace(result, 'xxx_e', '', [replacell]);
result:=StringReplace('result, '.xxx', '', [replaceall]);
неа ?
Чем разбираться в коде лучше было бы ОПИСАТЬ что делает функция.
По примеру остаются неясности.
1) удалять ВСЕ вхождения/только первое и только последнее.?
2) удалять только в начале и только в конце строк.?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.07.2015 в 19:31.
evg_m вне форума Ответить с цитированием
Старый 10.07.2015, 20:09   #4
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
result:='xxx_efegw.xxx';
result:=StringReplace(result, 'xxx_e', '', [replacell]);
result:=StringReplace('result, '.xxx', '', [replaceall]);
неа ?
Чем разбираться в коде лучше было бы ОПИСАТЬ что делает функция.
По примеру остаются неясности.
1) удалять ВСЕ вхождения/только первое и только последнее.?
2) удалять только в начале и только в конце строк.?
StringReplace точно нет, так -как она удаляет текст из строки
Моя функция удаляет весь текст от начала строки, до "xxx_e" захватывая длину искаемого слова. И точно так же с задней стороны..
Должно быть имя? вне форума Ответить с цитированием
Старый 10.07.2015, 22:27   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

и опять. Есть строка
смотриРАЗсмотриДВАсноваРАЗопятьДВАи тогоРАЗитогиДВАвсего
в качестве фильтра(строк отсечения) задаем
сначала ДВА
и в конце РАЗ !!!

Какой должен быть результат?
Такой строки быть не может! А какая она тогда может быть?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 11.07.2015, 13:27   #6
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Код:
function Parse(const Tag1, Tag2, source: string): string;
// uses StrUtils
var
  p, p2: Integer;
begin
  Result := '';
  p := StrUtils.PosEx(Tag1, source);

  p2 := StrUtils.PosEx(Tag2, source, p + Tag1.Length + 1);
  if (p = 0) or (p2 = 0) then
    exit;
  if p2 > p then
    Result := (Copy(source, p + Tag1.Length, p2 - p - Tag1.Length));
end;
пользуюсь своей, она универсальна под любую платформу.
// Parse('xxx_e', '.xxx', 'xxx_efewg.xxx') - будет fewg
ZuBy вне форума Ответить с цитированием
Старый 11.07.2015, 13:34   #7
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
и опять. Есть строка
смотриРАЗсмотриДВАсноваРАЗопятьДВАи тогоРАЗитогиДВАвсего
в качестве фильтра(строк отсечения) задаем
сначала ДВА
и в конце РАЗ !!!

Какой должен быть результат?
Такой строки быть не может! А какая она тогда может быть?
результат моей функции будет "снова"
ZuBy вне форума Ответить с цитированием
Старый 11.07.2015, 13:41   #8
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от ZuBy Посмотреть сообщение
[CODE]
пользуюсь своей, она универсальна под любую платформу.
// Parse('xxx_e', '.xxx', 'xxx_efewg.xxx') - будет fewg
Советчик, не пиши никогда эту фразу.

Проверил на делфи 7, сменив универсальность кода с Tag1.Length на Length(Tag1)

Код:
implementation
uses StrUtils;

{$R *.dfm}


function Parse(const Tag1, Tag2, source: string): string;
var
  p, p2: Integer;
begin
  Result := '';
  p := PosEx(Tag1, source);

  p2 := PosEx(Tag2, source, p + Length(Tag1) + 1);
  if (p = 0) or (p2 = 0) then
    exit;
  if p2 > p then
    Result := (Copy(source, p + Length(Tag1), p2 - p - Length(Tag1)));
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := Parse('','дуб', 'столетний дуб');
end;
в заголовке "пустота"
Вопрос, в чём универсальность?
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 11.07.2015 в 13:50.
JUDAS вне форума Ответить с цитированием
Старый 11.07.2015, 13:50   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Должно быть имя? Посмотреть сообщение
StringReplace точно нет, так -как она удаляет текст из строки
Моя функция удаляет весь текст от начала строки, до "xxx_e" захватывая длину искаемого слова. И точно так же с задней стороны..
Автор, а ты не удаляй с исходного текста

Код:
function shearPosString(const PosA, PosB, str: string): AnsiString;
begin
  result := AnsiReplaceText(str, PosA, '');
  result := AnsiReplaceText(result, PosB, '');
end;
в результате, и str "цел", и result "сыт"


попробуй вот этот
Код:
function shearPosString(const PosA, PosB, str: string): AnsiString;
var p : integer;
begin
  result :=  str;
  if (PosA<>'') and (pos(PosA,str)=1) then
   Delete(result, 1, length(PosA));
  if (PosB<>'') then
  begin
    p := pos(PosB,result);
    if (p+Length(PosB)=Length(result)+1) then
     Setlength(result, p-1);
  end;
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 11.07.2015 в 13:58.
JUDAS вне форума Ответить с цитированием
Старый 11.07.2015, 14:20   #10
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
Лампочка

Цитата:
Сообщение от ZuBy Посмотреть сообщение
результат моей функции будет "снова"
Вообще-то не верно Запустил код автора на Д7, выдало "новаРАЗопятьДВАи того", почему-то без "с".
В Д7 подобных функций не встречал.

И я бы посоветовал назвать функцию более понятно, аля strCopyBetween(), и последний параметр сделал бы первым.
ResourceSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог функции strtok Леопольдовна Общие вопросы C/C++ 4 04.04.2013 22:00
Аналог функции fscanf (C++) Andrey_k Помощь студентам 7 10.03.2011 19:59
Аналог функции ЧИСТРАБДНИ Mint86 Microsoft Office Excel 16 14.05.2010 09:55
Аналог функции ЧИСТВНДОХ Mint86 Microsoft Office Excel 7 13.05.2010 08:41
аналог функции case redfield Microsoft Office Excel 3 05.05.2010 12:25