> 1 <

Автор Сообщение

AYKO

Members


Статус

36 сообщений

Где: Russia
Род занятий: Чайник
Возраст:

#20   2008-09-22 18:11 GMT+3 часа(ов)      
Не нашел среди стандартных функций такой, которая заменяет часть строки совпадающий с образцом на некоторую произвольную строку. Плохо искал или действительно нет?

sdfgh153

Moderators


Статус

35 сообщений
http://sdfgh153.ru
Где: Russia Пермь
Род занятий: идиот
Возраст: 35

#25   2008-09-23 18:07 GMT+3 часа(ов)      
Стандартных функций какого лиспа? CL, Scheme, Elisp, AutoLISP?
Вообще в CL есть очень хорошая поддержка regex'ов, можно через них, или вот тебе код:
 
(defun string-replace (str1 sub1 sub2)
(let ((str1 (string str1))
(str2 "")
(sub1 (string sub1))
(sub2 (string sub2))
(index1 0))
(loop
(if (string-equal str1 sub1
:start1 index1
:end1 (min (length str1)
(+ index1 (length sub1))))
(progn
(setq str2 (concatenate 'string str2 sub2))
(incf index1 (length sub1)))
(progn
(setq str2 (concatenate 'string
str2
(subseq str1 index1 (1+ index1))))
(incf index1)))
(unless (< index1 (length str1))
(return str2)))))
 

Отсюда: http://www.tek-tips.com/viewthread.cfm?qid=1184743&page=1
грузим лf·(лx·f (x x)) (лx·f (x x)) вёдрами, недорого
(Артиш включи юникод, а)

Voins

Members


Статус

1 сообщений

Где: Russia
Род занятий:
Возраст:

#28   2008-09-23 20:46 GMT+3 часа(ов)      
Чего-то сложно и длинно как-то. Я бы вот так делал.
 
(defun seq-replace (what where with)
(let ((position (search what where)))
(if (not position) where
(concatenate (typecase where
(string 'string)
(vector 'vector)
(t (type-of where)))
(subseq where 0 position)
with
(subseq where (+ position (length what)))))))
 
CL_USER> (seq-replace '(3 4) #(1 2 3 4) "ddd")
#(1 2 #\d #\d #\d)
 


А вот чем typecast здесь заменить, чтобы ограничения на размер векторов/строк не просачивались в тип результата, я пока не знаю.

slobin

Members


Статус

9 сообщений

Где: Russia
Род занятий:
Возраст:

#29   2008-09-23 21:01 GMT+3 часа(ов)      
Цитата
sdfgh153 :

Вообще в CL есть очень хорошая поддержка regex'ов



В каких именно CL? А то попробовал я pcre в CLISP: всё на первый взгляд хорошо, полный юникод и благорастворение воздухов, но вот только смещения и длины найденных подстрок выдаются не в символах, а в байтах utf-8. Нет, конечно, можно сконвертить строку в byte-array, выкусить подмассив оттуда и сконвертить обратно в строку, но назвать это "хорошей поддержкой"?

AYKO

Members


Статус

36 сообщений

Где: Russia
Род занятий: Чайник
Возраст:

#31   2008-09-24 07:07 GMT+3 часа(ов)      
Выйти-то из положения не сложно. Я так на тот момент так сделал (хоть и не эффективно):
(defun string-subst (new old str)
(if (search old str)
(concatenate 'string
(subseq str 0 (search old str))
new
(subseq str (+ (search old str) (length old))))
str))
 

только думал, что пропустил что-то все ж таки язык символьной обработки =)

Не буду ли выглядеть глупо если спрошу что такое "поддержка regex'ов"?

daapp

Members


Статус

2 сообщений

Где: Japan
Род занятий:
Возраст:

#32   2008-09-25 14:03 GMT+3 часа(ов)      
Про замену читать здесь http://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm#replace.
Про regexp - нет глупо не будет, но чтобы пустых вопросов было поменьше - http://www.cliki.net/

AYKO

Members


Статус

36 сообщений

Где: Russia
Род занятий: Чайник
Возраст:

#39   2008-09-26 04:46 GMT+3 часа(ов)      
>daapp
Я, возможно, не корректно описал требуемое действие. Необходимо найти в строке часть совпадающую с образцом и заменить на некоторую строку произвольного размера. Replace мне совсем не подошел, да и меняет он строки одинаковых размеров, что также не то что мне требуется.

За Квики спасибо. На сколько я понял речь идет об этом: http://www.cliki.net/Regex однако сие, пока за пределами моего понимания =)
> 1 <


Онлайн :

0 пользователь(ей), 31 гость(ей) :