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

Вниз

Выделить кавычками "" слово из текста   Найти похожие ветки 

 
Овотог   (2009-07-11 16:59) [0]

Есть текст, нужно взять из него рендомное слово (или же несколько слов) и выделить их кавычками ""

на ум приходит разве что как то взять текст по условию пробел закинуть в Мемо а уже в мемо
Memo1.Strings[i]:="""+Memo1.Strings[1]+""";

Может у кого то есть мысли как это реализовать лучше? буду признателен за код...


 
KilkennyCat ©   (2009-07-11 17:39) [1]

SelStart, SelLength и т.д.


 
Овотог   (2009-07-11 17:40) [2]


> SelStart, SelLength и т.д.


Не понял, разьясните пожалуйста мысль.


 
KilkennyCat ©   (2009-07-11 17:42) [3]

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


 
KilkennyCat ©   (2009-07-11 17:43) [4]


>
> Не понял, разьясните пожалуйста мысль.


А справку глянуть?


 
TIF ©   (2009-07-11 18:05) [5]

> Memo1.Strings[i]:="""+Memo1.Strings[1]+""";

Тут выделяется кавычками не слово, а вторая СТРОКА


 
Овотог   (2009-07-11 19:12) [6]

TIF, опечатка, должно быть Memo1.Strings[i]:="""+Memo1.Strings[i]+""";


 
Овотог   (2009-07-11 19:15) [7]

А по поводу СТРОКА так читайте мой первый пост:


> на ум приходит разве что как то взять текст по условию пробел
> закинуть в Мемо а уже в мемо
> Memo1.Strings[i]:="""+Memo1.Strings[1]+""";


То есть идея взять текст разбить по пробелам в ТСтрингЛист (или мемо) там проставить кавычки так как я показывал а потом из стринглиста назад вернуть текст путем:

for i:=0 to Memo1.count-1 do
begin
text:=text+memo1.Strings[i]+" ";
end;


 
Овотог   (2009-07-11 19:16) [8]

Вот собственно вопрос - мне кажется так как я сделал это все коряво как то ... Может предложите какой то элегантный метод?


 
turbouser ©   (2009-07-11 19:26) [9]


> Овотог   (11.07.09 19:15) [7]

если правильно понял, то AnsiQuotedStr() +F1


 
TIF ©   (2009-07-11 19:40) [10]

> мне кажется так как я сделал это все коряво

Мягко сказано

> То есть идея взять текст разбить по пробелам в ТСтрингЛист
> (или мемо) там проставить кавычки так как я показывал а
> потом из стринглиста назад вернуть текст путем:

Как перекрасить машину? Сначала отвинтить колёса, чтобы не запачкались, покрасить кузов, потом привинтить колёса обратно

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

Примерный ответ уже был дан в [3]
> KilkennyCat ©   (11.07.09 17:42) [3]
> Или бежим побайтово от и до, встречаем пробел, запрашиваем
> рэндом. если гут, то добавляем кавычку, если не гут, не
> добавляем.

Что нужно? Использовать функции Pos, Insert и следующий алгоритм (подробно расписанное [3]):
1) Копируем текст из memo в строковую переменную s (желательно сделать, чтобы работать с переменной, а не напрямую с Memo, так как если требуется выполнить ОЧЕНЬ много выделений кавычками, несколько сотен или даже тысяч, то станут заметными тормоза. Если выделений планируется сделать всего несколько штук, можно плюнуть и работать с Memo.Text, но лучше не плевать, а привыкать к более разумному подходу :)

2) Находим пробел в тексте, содержаемся в строке s с помощью Pos. Запоминаем его позицию в переменную, допустим в a
3) Ищем следующий пробел, то есть мы ищем начало и конец "слова". Если мы дошли до конца строки, а пробел не встретили, значит это последнее "слово". Заносим позицию пробела (или номер последнего символа строки) в переменную b
4*) Подкидываем монетку (Random), чтобы определить судьбу "слова": выделить его кавычками или помиловать
5) Если решили выделять - с помощью Insert вставляем начальную и конечную кавычку в позиции a+1 и b (почему a+1? А это вы узнаете из описания функции Insert в справке, когда почитаете про её принцип действия)
_____
* - само собой, если требуется выделить кавычками ВСЕ слова, то игнорируем 4 и сразу выполняем 5 :)

Всё.


 
KilkennyCat ©   (2009-07-11 20:21) [11]


> TIF © (11.07.09 19:40) [10]
> Что нужно?


Грамотное ТЗ. У автора же совершенно непонятно, ни в каком виде поставляется текст, файл это, или в мемо уже, или еще где. Непонятно, как выделяется несколько слов: каждое, или вся цепочка. Он собирается использовать мемо как лист. Возникает снова вопрос: как учитывается перенос строк в случае выделения нескольких слов, если всей цепочкой?
Вот будет четко поставленная задача - будет четкий и оптимальный ответ. А иначе, помимо моего первого идиотского варианта через выделение, можно предложить еще через поиск, через реплэйс, через рандомное разбрасывание кавычек по всему тексту, а потом удалить те, которые рядом более чем с одной буквой. Да миллион способов. Включая предложенный автором.


 
Игорь Шевченко ©   (2009-07-11 22:27) [12]


> У автора же совершенно непонятно, ни в каком виде поставляется
> текст, файл это, или в мемо уже, или еще где


а в чем разница ?


 
KilkennyCat ©   (2009-07-11 23:42) [13]


> Игорь Шевченко © (11.07.09 22:27) [12]

Я ожидал такого вопроса :)
В принципе ни в чем... это, конечно, субъективно, но просто, если это текстовая фигня, у меня мозги автоматом ищут решения с использованием строковых функций. Если же по ТЗ не требуется давать возможность пользователю работать с текстом, то для меня это автоматом набор байт и алгоритм видится совершенно по-другому.
Немного сумбурно, но вообщем-то, так. Ибо если пользователь сам набивает текст в мемо, то уже на уровне набора можно выполнять какую-то работу, какие-то условия, и по нажатию кнопки Гоу выполнится уже нечто другое. А с файлом-то что можно сделать...


 
Германн ©   (2009-07-12 01:02) [14]


> KilkennyCat ©   (11.07.09 23:42) [13]
>
>
> > Игорь Шевченко © (11.07.09 22:27) [12]
>
> Я ожидал такого вопроса :)
> В принципе ни в чем... это, конечно, субъективно, но просто,
>  если это текстовая фигня, у меня мозги автоматом ищут решения
> с использованием строковых функций. Если же по ТЗ не требуется
> давать возможность пользователю работать с текстом, то для
> меня это автоматом набор байт и алгоритм видится совершенно
> по-другому.

Текст - он и в Африке текст. И ничего лучше строковых функций для него нет.


 
KilkennyCat ©   (2009-07-12 01:56) [15]


> Текст - он и в Африке текст. И ничего лучше строковых функций
> для него нет.


Вот так.


 
Овотог   (2009-07-12 19:04) [16]

Спасибо всем кто высказался.

У меня тут еще одна головоломка. Подскажите алгоритм - необходимо что бы функция позекс нашла конец предложения, но дело в том, что оно может заканчиваться не только точкой но и скажем знаками ?!...

Я пеализовал так тупо и просто:

i:=PosEx(". ",text,i+1);j:=PosEx("? ",text,i+1);k:=PosEx("! ",text,i+1);
if i<j AND i<k then res:=i
else if j<i AND j<k then res:=j
else res:=k;

Может как то поэлегантнее можно реализовать??


 
Игорь Шевченко ©   (2009-07-12 19:09) [17]


> но дело в том, что оно может заканчиваться не только точкой
> но и скажем знаками ?!...


какой кошмар!


 
Овотог   (2009-07-12 19:09) [18]

Сначала пробовал сделать что то типа
j:=PosEx(". ",text,i+1) OR PosEx("? ",text,i+1);
но выдает какой то бред оно получается сумирует позиции а хотелось бы что бы выдало позицию которая раньше


 
Sha ©   (2009-07-12 20:08) [19]

> Овотог   (12.07.09 19:09) [18]

Выделять в тексте слова и предложения при помощи PosEx непродуктивно.

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

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


 
Virgo_Style ©   (2009-07-13 10:17) [20]


> j:=PosEx(". ",text,i+1) OR PosEx("? ",text,i+1);


сурово


 
Dennis I. Komarov ©   (2009-07-13 10:40) [21]


> Virgo_Style ©   (13.07.09 10:17) [20]

надо было XORить ;)


 
clickmaker ©   (2009-07-13 12:33) [22]

> конец предложения, но дело в том, что оно может заканчиваться
> не только точкой но и скажем знаками ?!

function ispunct(c: integer): integer; cdecl; external "msvcrt.dll";



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

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

Наверх




Память: 0.53 MB
Время: 0.017 c
15-1247493335
Цукор5
2009-07-13 17:55
2009.09.13
Win2003 + запуск программы


9-1181818935
MegaVolt
2007-06-14 15:02
2009.09.13
Несколько компонентов исспользующих OpenGL не работают вместе :(


1-1215149667
dreamse
2008-07-04 09:34
2009.09.13
Как можно задать константу автоматически при выборе приложения?


15-1247658666
картман
2009-07-15 15:51
2009.09.13
Как добавить данные из БД в полученный ранее набор данных?


15-1247744302
djkondakov
2009-07-16 15:38
2009.09.13
Запись ключей реестра