Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
3-76271
Unicorn
2003-03-06 10:45
2003.03.24
SQl-запрос на копирование


14-76667
eger
2003-03-09 01:07
2003.03.24
OnlineIp - вопрос


1-76406
seledka
2003-03-13 13:51
2003.03.24
Identifier redeclared System


14-76654
Vavan
2003-03-08 14:44
2003.03.24
ошибка odac


14-76579
zavisalych
2003-03-06 14:57
2003.03.24
Подскажите где найти Delphi 6 RTL Update pack 2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский