Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

Отбирание слов из строки   Найти похожие ветки 

 
Kreporator   (2003-03-09 23:34) [0]

Нужно из строки в едите1 отобрать только слова, исключая различные знаки, и вывести их через запятую в едит2


 
Palladin ©   (2003-03-09 23:43) [1]

и что тебе мешает воплотить это в жизнь?


 
Kreporator   (2003-03-09 23:46) [2]

Так как это сделать?


 
Palladin ©   (2003-03-10 00:06) [3]

"программисты" блин, совсем думать обленились...
беги по строке в цикле да определяй что там такое и в зависимости от встреченого симовола производи нужные тебе действия...

трудно догадатся? да?

если уж совсем все плохо, то подскажу

for - оператор цикла
if then else - условный оператор
обращение к симоволу под номером i в строке есть s[i]


 
Dmitry Filippov ©   (2003-03-10 07:01) [4]

Может TStringList.ComaText подойдет


 
Kreporator   (2003-03-10 13:56) [5]

Хе..Так и знал. Я так тоже делал, как вы говорите, но
толку от этого никакого. Сами подумайте, сколько циклов и
сколько различных вариантов перебора нужно сделать.
Например:
1)Хлеб - всему голова!
Здесь: " - ", " " +откинуть последний символ "!"
2)Ну вы, блин, даёте...
Здесь: " ", ", " +откинуть последние три символа "..."
3) Вася, привет! =)
Здесь: ", " +откинуть последние 4 символа "! =)"

Нужно искать другой способ решения. Может лучше искать
по буквам? Т.е. как только попалаяь буква русского или
латинского алфавита, то считать это началом слова, а
как буквы закончаться - то концом.


 
Palladin ©   (2003-03-10 14:11) [6]

ты совсем с головой не дружишь

procedure GetWordsList(p_strSource:string;rp_Words:TStringList);
var
i:integer;
strCurrentWord:string;
begin
strCurrentWord:="";
for i:=1 to length(p_strSource) do
if ((p_strSource[i]>="a") and (p_strSource[i]<="z")) or // Eng
((p_strSource[i]>="A") and (p_strSource[i]<="Z")) or // Eng
((p_strSource[i]>="а") and (p_strSource[i]<="я")) or // Rus
((p_strSource[i]>="А") and (p_strSource[i]<="Я")) //Rus
then strCurrentWord:=strCurrentWord+p_strSource[i] else
if strCurrentWord<>"" then
begin
rp_Words.Add(strCurrentWord);
strCurrentWord:="";
end;
if strCurrentWord<>"" then rp_Words.Add(strCurrentWord);
end;

проверку символов на вхождение в допустимый диапазон можно изменить на лучшую, мне лень было таблицу сейчас ковырять...

не вижу описаные тобой кучу циклов и различных вариантов перебора...

думать лень или неспособность...


 
Kreporator   (2003-03-12 00:35) [7]

Вы меня конечно простите за то что я такой тупой, но как мне это использовать - Palladin © (10.03.03 14:11) ??
Если вам не трудно приведите пример обработчика клика по кнопке, чтобы из Edit1 брался текст, изменялся, и готовый появлялся в Edit2

Спасибо!


 
MAN-In-RED ©   (2003-03-12 01:07) [8]

Стоило бы чючють изменить код Palladin"а, для твоего случая, и небыло бы проблем...

procedure GetWordsList(p_strSource: TEdit; rp_Words: TEdit);
var
N :Integer;
StrCurrentWord :String;
begin
rp_Words.Clear;
StrCurrentWord := "";

for N:=1 to Length(p_strSource.Text) do
if ((p_strSource.Text[N]>="a") and (p_strSource.Text[N]<="z")) or
((p_strSource.Text[N]>="A") and (p_strSource.Text[N]<="Z")) or
((p_strSource.Text[N]>="


 
MAN-In-RED ©   (2003-03-12 01:12) [9]


> ((p_strSource.Text[N]>="


 
Paladin ©   (2003-03-12 01:43) [10]

а вот еще красивый вариант:

procedure GetWordsList( p_strSource: TEdit; rp_Words: TEdit);
const
separators = [" ", ",", ";", "."];
var
i, len,
wStart, wEnd : integer;
curWord,
source,
dest : String;

begin
source := p_strSource.Text;
len := length( source);
dest := "";
curWord := "";
i := 1;

while (i <= len) do begin
while (i <= len) and (source[ i] in separators) do inc( i); wStart := i;
while (i <= len) and not (source[ i] in separators) do inc( i); wEnd := i;
if ( wStart <> wEnd) then begin
curWord := Copy( source, wStart, wEnd- wStart);
if length( dest) > 0
then dest := dest + "," + curWord
else dest := curWord;
end;
end;

rp_Words.Text := dest;
end;


 
vuk ©   (2003-03-12 01:49) [11]

http://delphibase.endimus.com/?action=viewfunc&topic=strsearch&id=10063

В примере - как раз разбивка строки на слова.


 
Kreporator   (2003-03-12 11:17) [12]

>Palladin

Спасибо! Работает, но такая строка:
"Типа, привет, корефан. Ты - лох!"
Превращается в :
"Типа,привет,корефан.,Ты,-,лох!"

Т.е. остаются "!", "-", ".", да и смайлики наверное тоже буду оставаться. А мне надо чтобы ТОЛЬКО слова.


 
Sheriff   (2003-03-12 11:37) [13]

на скорую руку:
procedure TForm1.SpeedButton1Click(Sender: TObject);
const Sym: String = " .,/\+-*?!@#$%^&()~=|";
var i,j: Integer;
IsWord: Boolean;
begin
i:=1;
j:=1;
isWord:=true;
while i<=length(Edit1.Text) do begin
if pos(Edit1.Text[i],Sym)>0 then begin
if isWord then begin
if Edit2.Text>"" then Edit2.Text:=Edit2.Text+#44+copy(Edit1.Text,j,i-j)
else Edit2.Text:=copy(Edit1.Text,j,i-j);
isWord:=false;
j:=i;
end;
end else begin
if not isWord then j:=i;
isWord:=true;
end;
inc(i);
end;
ShowMessage("done");
end;


 
Kreporator   (2003-03-12 15:06) [14]

>Sheriff

Огрмнейшее спасибо!! Именно то, что надо!


 
REA ©   (2003-03-12 15:40) [15]

А ты не давай вводить что попало в Edit1 и задача на порядок упростится...


 
Sheriff   (2003-03-12 16:15) [16]

черта с два...если последний символ относится к слову - не работает!
вот это - лучше:
function TextToWordList(Tmp: String): String;
const Sym: String = " .,/\+-*?!@#$%^&()~=|"""<>_{}[]:;";
var i,j,k: Integer;
IsWord: Boolean;
begin
j:=1;
k:=0;
isWord:=true;
for i:=1 to length(Tmp) do begin
if (i=length(Tmp))and(pos(Tmp[i],Sym)=0) then k:=1;
if (pos(Tmp[i],Sym)>0)or(i=length(Tmp)) then begin
if isWord then begin
if Result>"" then Result:=Result+#44+copy(Tmp,j,i-j+k) else Result:=copy(Tmp,j,i-j+k);
j:=i;
end;
end else if not isWord then j:=i;
isWord:=pos(Tmp[i],Sym)=0;
end;
end;


 
Palladin ©   (2003-03-12 17:50) [17]


> Kreporator (12.03.03 11:17)

я же сказал что условие отбора нужных символов нужно изменить...

писал прямо здесь, ради того что бы показать что проблема и яйца выеденого не стОит, и алгоритм простейший, по этому лень было оптимизировать это условие...

> Sheriff (12.03.03 16:15)

по мимо этих символов существует еще туева хуча других...
я понимаю с pos быстрее, но не универсальней... если же использовать pos расчитывая на все символы-небуквы, то получится медленнее чем просто пробег по строке...

имхо: да и подход проверки на допустимые, логичней чем проверка на недопустимые...



Страницы: 1 вся ветка

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
1-76427
neodiX
2003-03-11 12:17
2003.03.24
Как скопировать битмап в массив байтов?


1-76457
merlot
2003-03-12 10:45
2003.03.24
Шифрование данных


3-76321
KoluChi
2003-03-05 13:16
2003.03.24
Чувствительность у регистру в MS Access


14-76583
ZeroDivide
2003-03-05 13:28
2003.03.24
Про мозги, опиум и TButton


1-76485
Raf
2003-03-12 13:00
2003.03.24
Типа AI братьев меньших!!!