Zykl0 发表于 2022-7-5 16:00:08

替换多个文本字符串

你好
 
我试图找到一个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")
)
 
有人可以修改它使它为我工作吗?
 
非常感谢。

ronjonp 发表于 2022-7-5 16:15:56

快速模式:
(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)
)

Grrr 发表于 2022-7-5 16:30:07

这个子功能可能很方便,但我无法在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

Zykl0 发表于 2022-7-5 16:33:01

非常感谢大家,这是完美的工作!

Roy_043 发表于 2022-7-5 16:42:35

注:
如果新字符串包含旧字符串:'(“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
)

ronjonp 发表于 2022-7-5 16:52:21

 
很好,罗伊

Grrr 发表于 2022-7-5 17:06:06

 
谢谢你,罗伊,我没有想到这个问题!
页: [1]
查看完整版本: 替换多个文本字符串