Форум: "Начинающим";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];
ВнизВытащить часть текста из Memo Найти похожие ветки
← →
Демерго (2010-12-01 13:54) [0]Всем привет!
Я хочу вытащить часть текста из Memo. Например:
Тест "Сегодня_хорошая_погода" и надо вытащить слово между "Сегодня_" и "_погода" и вставить в Edit. то есть чтобы текст в Edit = "хорошая".
Заранее большое спасибо!
← →
Palladin © (2010-12-01 14:01) [1]функция Pos обычно изучается еще в школе...
← →
Palladin © (2010-12-01 14:02) [2]... и функция Copy вместе с ней
← →
Ega23 © (2010-12-01 14:04) [3]1. Определиться, что такое "слово".
Набор символов, разделённых пробелом?
Набор символов, разделённых пробелом или спец.символами?
Набор символов, разделённых пробелом, спец.символами и знаками препинания?
Какой именно набор символов? "12пп45" - это слово или нет?
Ну а дальше разбить текст (Memo.Text) на массив "слов" и найти в нём разницу.
Второе - элементарная задачка для первого курса.
А вот с первым блоком - сложнее.
← →
Медвежонок Пятачок © (2010-12-01 14:10) [4]Можно проще.
Edit1.Text := "фиговая";
Memo1.Lines.text:= "Сегодня_" + Edit1.Text + "_погода";
← →
Демерго (2010-12-01 14:11) [5]Дело в том что я никакие курсы не посещал, самоучка. Надеюсь на пример кода.
Ситуация такая что я знаю слово А и слово Б и мне надо вытянуть текст который находится между этими словами.
← →
Медвежонок Пятачок © (2010-12-01 14:12) [6]Дело в том что я никакие курсы не посещал, самоучка.
А чего ты самоучка?
Что именно успел самовыучить?
← →
Демерго (2010-12-01 14:13) [7]я умею писать простенькие программы по примерам. не просто "скопировать код", а понять как оно работает и приспособить под свои нужды.
← →
Ega23 © (2010-12-01 14:14) [8]
> Ситуация такая что я знаю слово А и слово Б и мне надо вытянуть
> текст который находится между этими словами.
Тебе весь текст нужен?
А если у тебя 2 раза такое сочетание встречается?
А если эти сочетания вложенные?
Например, слово А и Б:
123 А ппп Б лтвыалт А А А олдтлыфвтмапшрт Б Б Б вввв АААБББ
← →
Медвежонок Пятачок © (2010-12-01 14:14) [9]ну замечательно.
выучи еще пару функций (что выше) и все будешь знать.
← →
Медвежонок Пятачок © (2010-12-01 14:16) [10]я умею писать простенькие программы по примерам. не просто "скопировать код"
В том смысле что не пользуешься (не умеешь?) буфером обмена, а переписываешь примеры?
← →
Демерго (2010-12-01 14:18) [11]To Ega23:
Вот конкретный пример:
Привет</td><td style="width:40%; text-align:left;">1</td>
Мне нужно вытащить текст между Привет</td><td style="width:40%; text-align:left;"> и </td>
← →
Демерго (2010-12-01 14:20) [12]то есть вырезанный текст должен быть = 1
← →
Ega23 © (2010-12-01 14:23) [13]Вот строка.
Привет</td><td style="width:40%; text-align:left;">2222 Привет</td><td style="width:40%; text-align:left;">1</td> </td>
Что у тебя должно получиться?
← →
Демерго (2010-12-01 14:24) [14]В моем тексте только один раз встречается Привет</td><td style="width:40%; text-align:left;">
Проще говоря я могу задать уникальные А и Б между которыми надо вырезать текст
← →
Демерго (2010-12-01 14:26) [15]а в твоем примере должно получится 2222 Привет
← →
Ega23 © (2010-12-01 14:27) [16]
> Проще говоря я могу задать уникальные А и Б между которыми
> надо вырезать текст
два раза Pos, один раз Copy. Справку по обеим функциям можно вызвать по F1
← →
Демерго (2010-12-01 14:27) [17]Программа находит текст А, после этого она копирует все символы в Edit пока не дойдет до текста Б
← →
Медвежонок Пятачок © (2010-12-01 14:27) [18]а можно небольшой пример?
← →
stas © (2010-12-01 14:28) [19]задаешь начало строки, конец, результат середина, если начало не найдено вернет начиная с 1-го символа.
Function StrCut (SourceString,StartStr,EndStr:String):String;
Var I,K:Integer; Strn:String;
begin
Result:="";
strn:=SourceString;
i:=Pos(StartStr,Strn);
Strn:=Copy (Strn,i+Length(StartStr),Length(Strn)-Length(StartStr));
i:=Pos(EndStr,Strn);
if i=0 then
begin
i:=Length(Strn);
K:=0;
end else k:=Length(EndStr);
Strn:=Copy (Strn,1,i-1);
Result:=Strn;
end;
← →
Ega23 © (2010-12-01 14:29) [20]
> Программа находит текст А, после этого она копирует все
> символы в Edit пока не дойдет до текста Б
Это не сочетается с
> а в твоем примере должно получится 2222 Привет
← →
Ega23 © (2010-12-01 14:34) [21]
> stas © (01.12.10 14:28) [19]
1. В твоём коде ошибка.
2. Вычислять каждый раз Length(StartStr), Length(EndStr) - моветон.
Задача в целом, судя по всему, рекурсивная. Но не надо забывать, что строка неправильной может быть, типа A 111 A 222 B ddd A fff B
← →
Palladin © (2010-12-01 14:37) [22]основная трабла всех начинающих: внутриголовной компилятор хотелок работает с грубейшими ошибками, его чинить надобно...
кто-то не чинит... вырастает быдлокодер.... задумайся, о аффтар, пока не поздно )
← →
stas © (2010-12-01 14:41) [23]1. В каком месте?
2. Согласен.
← →
Ega23 © (2010-12-01 14:42) [24]
> Palladin © (01.12.10 14:37) [22]
У нас подобные задачки на первом курсе давали. Практика показала, что те, кто решил сам - стали программистами. Те, кто не решил - стали манагерами.
← →
stas © (2010-12-01 14:43) [25]Вообще для таких целей надо юзать RegExpr"ы. А вырезать уже предварительно обработанную строку.
RegExpr - регулярные выражения. Для Delphi есть бесплатная библиотека.
← →
Демерго (2010-12-01 14:45) [26]Всем огромнейшее спасибо! особенно stas. Код уже присобачен и работает :)
Выглядит на примере так:
procedure TForm1.Button1Click(Sender: TObject);
var I5,K:Integer; Strn:String;
begin
strn:=form1.Memo1.Lines[0];
i5:=Pos("Me",Strn);
Strn:=Copy (Strn,i5+Length("Me"),Length(Strn)-Length("Me"));
i5:=Pos("o1",Strn);
if i5=0 then
begin
i5:=Length(Strn);
K:=0;
end else k:=Length("o1");
Strn:=Copy (Strn,1,i5-1);
Edit1.Text:=Strn;
end;
После выполнения выдает букву m
← →
Ega23 © (2010-12-01 14:45) [27]
> stas © (01.12.10 14:41) [23]
>
> 1. В каком месте?
представь, что Pos(StartStr,Strn) равно 0.
← →
stas © (2010-12-01 14:46) [28]Демерго (01.12.10 14:45) [26]
его надо было как функцию использовать ).
← →
Ega23 © (2010-12-01 14:47) [29]
> Код уже присобачен и работает :)
Теперь возьми и вместо "Me" задай стартовую строку "jsahbfjuhsafdyu"
И насладись.
← →
Демерго (2010-12-01 14:48) [30]мне проще 10 раз этот код прописать и получить результат чем разбираться как эти функции потом вызывать правильно :) Главное я получил что хотел и тебе спасибо что сразу дал пример
← →
Демерго (2010-12-01 14:49) [31]то Ega23:
надеюсь это был не сарказм и все будет работать даже с такой строкой как "jsahbfjuhsafdyu" :)
← →
Ega23 © (2010-12-01 14:49) [32]
> Демерго (01.12.10 14:13) [7]
>
> я умею писать простенькие программы по примерам. не просто
> "скопировать код", а понять как оно работает и приспособить
> под свои нужды.
> Демерго (01.12.10 14:48) [30]
>
> мне проще 10 раз этот код прописать и получить результат
> чем разбираться как эти функции потом вызывать правильно
> :) Главное я получил что хотел и тебе спасибо что сразу
> дал пример
Быдлокодер детектед.
← →
stas © (2010-12-01 14:50) [33]Ega23 © (01.12.10 14:45) [27]
точно спасибо. )
← →
Демерго (2010-12-01 14:51) [34]то Ega23:
я пишу ТОЛЬКО для себя и ни для кого более. Мне важен результат а не размер и скорость выполнения программы в миллисекундах. Но все равно спасибо на добром слове
← →
Leonid Troyanovsky © (2010-12-01 22:51) [35]
> Демерго (01.12.10 13:54)
RTFM: SelText.
--
Regards, LVT.
← →
Inovet © (2010-12-02 00:41) [36]> [34] Демерго (01.12.10 14:51)
> я пишу ТОЛЬКО для себя и ни для кого более. Мне важен результат
> а не размер и скорость выполнения программы
Так не сколрость и размер, а сам же потом и наступишь в этот код десять раз.
← →
Демерго (2010-12-02 14:59) [37]
> stas ©
Надеюсь еще на одну твою подсказку по следующему вовпросу:
procedure TForm1.Button1Click(Sender: TObject);
var I5,K:Integer; Strn:String;
begin
strn:=form1.Memo1.text;
i5:=Pos("Me",Strn);
Strn:=Copy (Strn,i5+Length("Me"),Length(Strn)-Length("Me"));
i5:=Pos("o1",Strn);
if i5=0 then
begin
i5:=Length(Strn);
K:=0;
end else k:=Length("o1");
Strn:=Copy (Strn,1,i5-1);
Edit1.Text:=Strn;
end;
Код выдает то что находится между "Me" и "o1" только в том случае если "Me" или "o1" находятся в одной строке. То есть если в случае "Me" буква М будет в строке(1) а буква е в строке(2) то код не воспринимает это как одно целое.
Пример.
есть слово memo.line[0]="Метаболизм".
В коде прописываем вырезать между "Ме" и "изм". Получаем "табол".
Но если слово записано в в двух строках:
memo.line[0]="М".
memo.line[1]="етаболизм".
то код уже не дает нужного результата.
Можно как-то слить все memo.line в одну строку, чтобы небыло этих разрывов? или возможно есть какое-то другое решение
← →
Ega23 © (2010-12-02 15:04) [38]
> Демерго
Чукча не читатель. Я тебе на этот вопрос уже отвечал.
Но ты его проигнорировал, выпрашивая код.
На месте stas я бы не отвечал.
← →
stas © (2010-12-02 15:05) [39]да т.к. между "М" и "e" есть непечатаемые символы их можно помоему #13#10 точно незнаю. Их можно исключить с помощью
Text:=StrUtils.AnsiReplaceStr(memo1.text,#13#10,"");
Типа такого что-то.
← →
stas © (2010-12-02 15:10) [40]Демерго (02.12.10 14:59) [37]
Честно говоря Ega23 прав нужно разобраться т.к. одно дело работать с простой строкой, другое дело парсить html. У тебя будут возникать все новые и новые проблемы, твой код начнет обрастать подпорками, потом ты в нем не разберешься.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.004 c