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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2016, 05:56   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Выбрать текст между двумя словами, когда начало второго неизвестно

Доброго времени суток!
Есть небольшая задачка.
Есть строка. Она начинается с определенного символа, потом идет число, потом 3 подряд буквы, потом дальше число.
Мне нужно получить число, которое идет после самого первого символа, с которого начинается строка и стоит перед тремя подряд идущими буквами.
100% там будут 3 подряд буквы, буквы будут разные, но точно будут буквы.
Например, есть строка.
C1ABC0000.
Нужно получить число 1 (потому что оно стоит до ABC)
Или другой пример.
С10DEF0011
Нужно получить число 10 (потому что оно стоит до DEF)
И так далее.
Функция получения текста между словами у меня есть. Вопрос в том, как в качестве "правой границы диапазона поиска" указать, что искать до трех рядом стоящих букв.
Прошу помочь, кто чем может, но только не деньгами

Вот функция по выборе текста между словами, которая, по идее, должна работать (нашел в Интернете):
Код:
function get_stext(First, Second, Where: string): string;
var
  Pos1, Pos2: Integer;
  WhereLower: string;
begin
  First := LowerCase(First);
  Second := LowerCase(Second);
  WhereLower := LowerCase(Where);
  Assert(Length(WhereLower) = Length(Where));

  Pos1 := PosEx(First, WhereLower, 0);
  Pos2 := PosEx(Second, WhereLower, Pos1);
  Result := Copy(Where, Pos1 + Length(First), Pos2 - Pos1 - Length(First));
end;

var st: string;
begin
  st := get_stext('first_word', 'second_word',
    '123123 First_word <some text> 123123    elseFDFsdf  0123123 Second_word');
  ShowMessage(st);  // вывод " <some text> 123123    elseFDFsdf  0123123 "
end;
Моя идея была такой как решить данную задачу: поскольку первый символ в строке фиксированный, то левая граница известна. Далее, убираю все числа в исходной строке и поэтому получаю как раз нужные мне три рядом стоящие буквы, причем не важно, что за буквы. Казалось бы, что правая граница найдена и должно работать.
Но!
В результате мне выдается пустое сообщение. Хотя моя идея вроде как работает.
Вот, что я делал:
Код:
var
 ss,newss: string;
begin
 ss:=Form_Main.sEdit1.Text; //исходная строка в sEdit1, в которой надо найти число между первым фиксированным символов и тремя подряд стоящими буквами
 ss:=StringReplace(ss,ss[1],'',[rfReplaceAll]);
 ss:=StringReplace(ss,'0','',[rfReplaceAll]);
 ss:=StringReplace(ss,'1','',[rfReplaceAll]);
 ss:=StringReplace(ss,'2','',[rfReplaceAll]);
 ss:=StringReplace(ss,'3','',[rfReplaceAll]);
 ss:=StringReplace(ss,'4','',[rfReplaceAll]);
 ss:=StringReplace(ss,'5','',[rfReplaceAll]);
 ss:=StringReplace(ss,'6','',[rfReplaceAll]);
 ss:=StringReplace(ss,'7','',[rfReplaceAll]);
 ss:=StringReplace(ss,'8','',[rfReplaceAll]);
 ss:=StringReplace(ss,'9','',[rfReplaceAll]);
 newss:=ss;
 ShowMessage(Form_Main.sEdit1.Text[1])); //чтобы увидеть, что в качестве левой границы берется (работает)
 ShowMessage(newss); //чтобы увидеть, что в качестве правой границы получается (нужные три буквы)
 ShowMessage(get_stext(Form_Main.sEdit1.Text[1],newss,Form_Main.sEdit1.Text));
Но, в результате пустая строка.


Прошу помочь доделать...

----------------------------------------------------------------------------------------------------------------------------------
Вообщем, моя смекалка снова помогла мне))
Вообщем, я нашел решение в одну строку.
У меня есть функция, которая ищет текст до указанного значения. Речь о функции GetBefore().
Я ее применил к моей идее, код который я привел чуть выше, и, работает!
Дальше просто нужно убрать первый символ из полученной строки и все, получил искомое число)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 17.11.2016 в 07:14.
artemavd вне форума Ответить с цитированием
Старый 17.11.2016, 08:43   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну число с фиксированной позиции - от нее искать первую не цифру просто в цикле и всех делов. Не важно сколько там буков подряд 1, 2 или 22
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.11.2016, 10:40   #3
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

В цикле со второго элемента проверять на букву и если верно то остановить цикл, иначе добавить в строку.
Например так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i     : integer;
  s, ss : string;
begin
  ss := Edit1.Text; // Ваша исходная строка
  s := EmptyStr;
  for i:=2 to Length (ss) do
    begin
      if ss[i] in ['A'..'Z'] then // При условии, что в исходной строке буквы только заглавные и латинские
        break else
        s := s + ss[i];
    end;
  ShowMessage (s);
end;

Последний раз редактировалось FaTaL; 17.11.2016 в 12:21.
FaTaL вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как найти кол-во символов между двумя одинаковыми словами? Павел2517 Помощь студентам 2 26.03.2016 22:15
Паскаль АBC, строки. Дан текст. Между соседними словами – не менее одного пробела, за последним словом. Margosham-k Помощь студентам 0 18.04.2012 15:28
Выбрать даты в StringGrid находящиеся между двумя другими датами Serebah Общие вопросы Delphi 7 03.02.2011 14:51
копирование текста между двумя словами pavel.lug Microsoft Office Word 14 28.08.2009 14:27
Как обрезать строку между двумя словами vitaleg PHP 3 28.07.2009 20:32