![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделить кавычками "" слово из текста
Овотог © (2009-07-11 16:59:00)Есть текст, нужно взять из него рендомное слово (или же несколько слов) и выделить их кавычками ""
на ум приходит разве что как то взять текст по условию пробел закинуть в Мемо а уже в мемо
Memo1.Strings[i]:='"'+Memo1.Strings[1]+'"';
Может у кого то есть мысли как это реализовать лучше? буду признателен за код...
clickmaker (2009-07-13 12:33:00) [1]> конец предложения, но дело в том, что оно может заканчиваться
> не только точкой но и скажем знаками ?!
function ispunct(c: integer): integer; cdecl; external 'msvcrt.dll';
Dennis I. Komarov (2009-07-13 10:40:00) [2]
> Virgo_Style © (13.07.09 10:17) [20]
надо было XORить ;)
Virgo_Style (2009-07-13 10:17:00) [3]
> j:=PosEx('. ',text,i+1) OR PosEx('? ',text,i+1);
сурово
Sha (2009-07-12 20:08:00) [4]> Овотог (12.07.09 19:09) [18]
Выделять в тексте слова и предложения при помощи PosEx непродуктивно.
Определись с тем, что есть слово и предложение в твоем случае:
из каких символов состоят слова, какие символы являются разделителями
слов, какие - разделителями предложений.
После этого тебе останется в цикле проанализировать символы текста и запомнить позиции начала и конца слов и предложений.
Овотог (2009-07-12 19:09:00) [5]Сначала пробовал сделать что то типа
j:=PosEx('. ',text,i+1) OR PosEx('? ',text,i+1);
но выдает какой то бред оно получается сумирует позиции а хотелось бы что бы выдало позицию которая раньше
Игорь Шевченко (2009-07-12 19:09:00) [6]
> но дело в том, что оно может заканчиваться не только точкой
> но и скажем знаками ?!...
какой кошмар!
Овотог (2009-07-12 19:04:00) [7]Спасибо всем кто высказался.
У меня тут еще одна головоломка. Подскажите алгоритм - необходимо что бы функция позекс нашла конец предложения, но дело в том, что оно может заканчиваться не только точкой но и скажем знаками ?!...
Я пеализовал так тупо и просто:
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;
Может как то поэлегантнее можно реализовать??
KilkennyCat (2009-07-12 01:56:00) [8]
> Текст - он и в Африке текст. И ничего лучше строковых функций
> для него нет.
Вот так.
Германн (2009-07-12 01:02:00) [9]
> KilkennyCat © (11.07.09 23:42) [13]
>
>
> > Игорь Шевченко © (11.07.09 22:27) [12]
>
> Я ожидал такого вопроса :)
> В принципе ни в чем... это, конечно, субъективно, но просто,
> если это текстовая фигня, у меня мозги автоматом ищут решения
> с использованием строковых функций. Если же по ТЗ не требуется
> давать возможность пользователю работать с текстом, то для
> меня это автоматом набор байт и алгоритм видится совершенно
> по-другому.
Текст - он и в Африке текст. И ничего лучше строковых функций для него нет.
KilkennyCat (2009-07-11 23:42:00) [10]
> Игорь Шевченко © (11.07.09 22:27) [12]
Я ожидал такого вопроса :)
В принципе ни в чем... это, конечно, субъективно, но просто, если это текстовая фигня, у меня мозги автоматом ищут решения с использованием строковых функций. Если же по ТЗ не требуется давать возможность пользователю работать с текстом, то для меня это автоматом набор байт и алгоритм видится совершенно по-другому.
Немного сумбурно, но вообщем-то, так. Ибо если пользователь сам набивает текст в мемо, то уже на уровне набора можно выполнять какую-то работу, какие-то условия, и по нажатию кнопки Гоу выполнится уже нечто другое. А с файлом-то что можно сделать...
Игорь Шевченко (2009-07-11 22:27:00) [11]
> У автора же совершенно непонятно, ни в каком виде поставляется
> текст, файл это, или в мемо уже, или еще где
а в чем разница ?
KilkennyCat (2009-07-11 20:21:00) [12]
> TIF © (11.07.09 19:40) [10]
> Что нужно?
Грамотное ТЗ. У автора же совершенно непонятно, ни в каком виде поставляется текст, файл это, или в мемо уже, или еще где. Непонятно, как выделяется несколько слов: каждое, или вся цепочка. Он собирается использовать мемо как лист. Возникает снова вопрос: как учитывается перенос строк в случае выделения нескольких слов, если всей цепочкой?
Вот будет четко поставленная задача - будет четкий и оптимальный ответ. А иначе, помимо моего первого идиотского варианта через выделение, можно предложить еще через поиск, через реплэйс, через рандомное разбрасывание кавычек по всему тексту, а потом удалить те, которые рядом более чем с одной буквой. Да миллион способов. Включая предложенный автором.
TIF (2009-07-11 19:40:00) [13]> мне кажется так как я сделал это все коряво
Мягко сказано
> То есть идея взять текст разбить по пробелам в ТСтрингЛист
> (или мемо) там проставить кавычки так как я показывал а
> потом из стринглиста назад вернуть текст путем:
Как перекрасить машину? Сначала отвинтить колёса, чтобы не запачкались, покрасить кузов, потом привинтить колёса обратно
Вот такой же избыточно туповатый у тебя алгоритм достижения результата
Примерный ответ уже был дан в [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 :)
Всё.
turbouser (2009-07-11 19:26:00) [14]
> Овотог (11.07.09 19:15) [7]
если правильно понял, то AnsiQuotedStr() +F1
Овотог (2009-07-11 19:16:00) [15]Вот собственно вопрос - мне кажется так как я сделал это все коряво как то ... Может предложите какой то элегантный метод?
Овотог (2009-07-11 19:15:00) [16]А по поводу СТРОКА так читайте мой первый пост:
> на ум приходит разве что как то взять текст по условию пробел
> закинуть в Мемо а уже в мемо
> 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:12:00) [17]TIF, опечатка, должно быть Memo1.Strings[i]:='"'+Memo1.Strings[i]+'"';
TIF (2009-07-11 18:05:00) [18]> Memo1.Strings[i]:='"'+Memo1. Strings[1]+'"';
Тут выделяется кавычками не слово, а вторая СТРОКА
KilkennyCat (2009-07-11 17:43:00) [19]
>
> Не понял, разьясните пожалуйста мысль.
А справку глянуть?
KilkennyCat (2009-07-11 17:42:00) [20]Или бежим побайтово от и до, встречаем пробел, запрашиваем рэндом. если гут, то добавляем кавычку, если не гут, не добавляем.