替换多个文本字符串
你好我试图找到一个lisp,它将搜索和替换用户选择中的文本。
我在网上一个很老的论坛上找到的这段代码几乎完全符合我的需要。
唯一的问题是我想替换句子中的单个单词,而这个代码只在单词单独存在时才替换它。
(defun c:TRANSLATE()
(command "cmdecho" "0")
(command "_.undo" "begin")
(setq mylist (list
(list "APPLE" "PEAR")
(list "BANANA" "STRAWBERRY")
)
)
(setq sset (ssget '((0 . "TEXT"))))
(setq i 0)
(while (< i (sslength sset))
(setq obj (ssname sset i))
(setq str (cdr (assoc 1 (setq lst (entget obj)))))
(princ str)
(princ "\n")
(foreach item mylist
(if (eq str (nth 0 item))
(progn
(setq newstr (nth 1 item))
(if newstr
(entmod (subst (cons 1 newstr)(assoc 1 lst) lst))
)
)
)
)
(setq i (1+ i))
)
(command "cmdecho" "1")
(command "_.undo" "end")
)
有人可以修改它使它为我工作吗?
非常感谢。 快速模式:
(defun c:translate (/ el mylist sset str)
(command "cmdecho" "0")
(command "_.undo" "begin")
(setq mylist '(("APPLE" "PEAR") ("STRAWBERRY" "BANANA")))
(if (setq sset (ssget ":L" '((0 . "TEXT"))))
(foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex sset)))
(setq str (cdr (assoc 1 (setq el (entget e)))))
(foreach item mylist
(if (vl-string-search (car item) str)
(progn (while (vl-string-search (car item) str)
(setq str (vl-string-subst (cadr item) (car item) str))
)
(entmod (subst (cons 1 str) (assoc 1 el) el))
)
)
)
)
)
(command "cmdecho" "1")
(command "_.undo" "end")
(princ)
) 这个子功能可能很方便,但我无法在ATM上测试它:
; (_ReplaceWords
; "APPLE IS MY FAVOURITE FRUIT BUT I HAVE ONLY STRAWBERRYS"
; '(("APPLE" "PEAR") ("STRAWBERRY" "BANANA"))
; )
(defun _ReplaceWords ( str aL )
(mapcar
'(lambda (old new) (while (vl-string-search old str) (setq str (vl-string-subst new old str))))
(mapcar 'car aL) (mapcar 'cadr aL)
)
str
); defun _ReplaceWords
非常感谢大家,这是完美的工作! 注:
如果新字符串包含旧字符串:'(“APPLE”“APPLES”),(while (vl-string-search old str) ...)是有问题的。
以下是我的建议:
; (String_Subst "aabbaacc" "aa" "xx") => "xxbbxxcc"
; (String_Subst "aabbaacc" "aa" "xxaa") => "xxaabbxxaacc"
(defun String_Subst (str old new / idx)
(setq idx 0)
(while (setq idx (vl-string-search old str idx))
(setq str (vl-string-subst new old str idx))
(setq idx (+ idx (strlen new)))
)
str
)
很好,罗伊
谢谢你,罗伊,我没有想到这个问题!
页:
[1]