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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2015, 11:47   #1
pavel151
Новичок
Джуниор
 
Регистрация: 12.01.2015
Сообщений: 1
Радость Извлечь последнее вхождение из скобок

Добрый день всем, кто поситил эту страницу)
Вопрос такой, как в Delphi/FPC извлечь текст из последнего вхождения, например дан текст "1+(2+(3+(4+5)))", должно получиться "(4+5)".
Заранее спасибо)
pavel151 вне форума Ответить с цитированием
Старый 12.09.2015, 13:24   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зависит от задачи. Если все выражения такого вида и в них только + (одинаковый приоритет операторов), то наверно можно придумать какой-нибудь несложный костыль, работающий на всех нужных данных. А так можно использовать какой-нибудь из алгоритмов разбора выражения, гугл в помощь. Например https://ru.wikipedia.org/wiki/%D0%90...86%D0%B8%D0%B8 для превращения в обратную польскую нотацию или дерево, ну а после этого уже легко определить что будет вычисляться последним.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.09.2015, 14:26   #3
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Код:
function Work(Str: String): String;
var
i,k,i1,k1: integer; 
begin
repeat 
i:=0;
k:=0;
Result:=Copy(Str,i,k-i+1);
i:=PosEx(Str,'(',i1);
k:=PosEx(Str,')',k1);
i1:=i+1;
k1:=k+1;
until (i>0) and (k>0);
end;
Вот и всё! Учись!
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 14.09.2015, 14:32   #4
SQLPowerUser
Форумчанин
 
Аватар для SQLPowerUser
 
Регистрация: 19.01.2015
Сообщений: 158
Стрелка Для данного случая можно так

Код:
function getLastEntry(s: string): string;
var
  i, p: integer;
begin
  p := 1; Result := s;
  for i := 1 to Length(s) do
  begin
    if s[i] = '(' then p := i;
    if s[i] = ')' then begin
      Result := copy(s,p,i-p+1);
      break;
    end;
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.Add(getLastEntry('1+(2+(3+(4+5)))'));
  Memo1.Lines.Add(getLastEntry('1+(2+3)'));
  Memo1.Lines.Add(getLastEntry('(1+2)'));
  Memo1.Lines.Add(getLastEntry('()'));
  Memo1.Lines.Add(getLastEntry('some data'));
end;
SQLPowerUser вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить правильность скобок (С++) Cheat Помощь студентам 24 03.02.2013 19:34
Корректность скобок! Sport Помощь студентам 3 22.03.2012 20:33
Проверка на колличество скобок! Lemo Помощь студентам 2 01.11.2009 15:16
Расстоновка скобок Ser Общие вопросы по Java, Java SE, Kotlin 4 25.05.2009 22:53
Структуры.Баланс скобок. Влад-mego Общие вопросы C/C++ 2 20.04.2009 00:59