Форум: "Основная";
Текущий архив: 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