PDA

Просмотр полной версии : Вытащить из текста все слова ничинающиеся на Сверх


bootsektor
08.06.2010, 03:47
Есть текст в нем есть слова которые начинаються на слоги "Сверх"
надо вытащить все эти слова. что бы получился список с такими словами.

Что-то пробую пробую, получилось только методом выделения текста и копирования. memo1.seltext.
Это очень медленно. Помогите народ. дайте пример?
Надо на делфи

090808
08.06.2010, 04:18
Очень просто

Кидаешь на форму 2 memo в memo1 кидаешь свои слова на кнопку кидаешь

var
i:integer;
begin
For i:=0 to memo1.lines.Count-1 do
if pos ('Вверх',memo1.lines[i])<>0 then
memo2.lines.Add(memo1.lines[i])
При нажатие на кнопку слова с "Сверх" с memo1 будут скопированы в memo2

bootsektor
08.06.2010, 04:45
090808, твой код копирует строки.
а надо слова.

Была сверх новая звезда блабла. сверхновый блабла.
привет сверху блабла

надо что бы вытащились слова: сверх, сверхновый, сверху

зы все слова одинаковой длины! в примере просто разная длина. длина слов: 8 символов

090808
08.06.2010, 05:33
var
Find,s:string;
i:integer;
begin
find:='Сверх';
For i:=0 to Memo1.Lines.Count-1 do
If Pos(FIND, Memo1.Lines.Text)<>0
Then
Begin
Memo1.SetFocus();
Memo1.SelStart:=Pos(FIND,Memo1.Lines.Text)-1;
Memo1.SelLength:=Length(FIND)+3;
Memo2.Lines.Add(Memo1.SelText);
Memo1.text:=StringReplace(memo1.Text,Memo1.SelText ,'',[rfReplaceAll]);

SultanOFF
08.06.2010, 08:44
procedure TForm1.btn1Click(Sender: TObject);
var reg1: tregexpr;
begin
reg1:= tregexpr.create;
reg1.Expression:='(сверх.*?) ';
if reg1.Exec(mmo1.Text) then begin
repeat
mmo2.Lines.Add(reg1.Match[1]);
until not reg1.ExecNext;
end; end;
Используя регулярки. Легко и быстро. Текст берется из mmo1.text и вставляется в mmo2.text

bootsektor
08.06.2010, 10:34
090808, я же в топике писал, что чкркз сел текст сам сделал. но очень долго работает
SultanOFF, ошибка: [Error] Unit1.pas(29): Undeclared identifier: 'tregexpr'

M_script_
08.06.2010, 10:42
все просто

while(sText.Pos("сверх"))
{
sText.Delete(1, sText.Pos("сверх") + 5 - 1);
sWord = sText;
sWord.SetLength(sWord.Pos(" ") - 1);
Memo1->Lines->Add("сверх" + sWord);
}

SultanOFF
08.06.2010, 10:49
SultanOFF, ошибка: [Error] Unit1.pas(29): Undeclared identifier: 'tregexpr'ты пропиши в uses regexpr; предварительно скачав модуль регулярок и положив в папку с проектом. Модуль можешь скачать отсюда (http://narod.ru/disk/21641853000/RegExpr.pas.html)

bootsektor
08.06.2010, 10:55
SultanOFF, спасибо. так и сделал. но как решить вопрос то что после слова может быть не токо пробел? ище точки цифры и тд?)

M_script_
08.06.2010, 11:08
SultanOFF, спасибо. так и сделал. но как решить вопрос то что после слова может быть не токо пробел? ище точки цифры и тд?)
...
for(int i = 1; i <= sWord.Length(); ++i)
{
if(sWord[i] < 'а' || sWord[i] > 'я')
{
sWord.SetLength(i - 1);
break;
}
}

bootsektor
08.06.2010, 11:11
Всем спасибо вообщем вроде сделал работает.
M_script_, надо было на делфи)

M_script_
08.06.2010, 11:19
Всем спасибо вообщем вроде сделал работает.
M_script_, надо было на делфи)
VCL один, только синтаксис немного изменить нужно.