乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 49|回复: 6

[编程交流] 替换多个文本字符串

[复制链接]

9

主题

33

帖子

23

银币

初来乍到

Rank: 1

铜币
47
发表于 2022-7-5 16:00:08 | 显示全部楼层 |阅读模式
你好
 
我试图找到一个lisp,它将搜索和替换用户选择中的文本。
我在网上一个很老的论坛上找到的这段代码几乎完全符合我的需要。
唯一的问题是我想替换句子中的单个单词,而这个代码只在单词单独存在时才替换它。
 
  1. (defun c:TRANSLATE()
  2. (command "cmdecho" "0")
  3. (command "_.undo" "begin")
  4. (setq mylist (list
  5. (list "APPLE" "PEAR")
  6. (list "BANANA" "STRAWBERRY")
  7. )
  8. )
  9. (setq sset (ssget '((0 . "TEXT"))))
  10. (setq i 0)
  11. (while (< i (sslength sset))
  12. (setq obj (ssname sset i))
  13. (setq str (cdr (assoc 1 (setq lst (entget obj)))))
  14. (princ str)
  15. (princ "\n")
  16. (foreach item mylist
  17.    (if (eq str (nth 0 item))
  18.      (progn
  19.      (setq newstr (nth 1 item))
  20.             (if newstr
  21.                    (entmod (subst (cons 1 newstr)(assoc 1 lst) lst))
  22.           )
  23.      )
  24.    )
  25. )
  26. (setq i (1+ i))
  27. )
  28. (command "cmdecho" "1")
  29. (command "_.undo" "end")
  30. )

 
有人可以修改它使它为我工作吗?
 
非常感谢。
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:15:56 | 显示全部楼层
快速模式:
  1. (defun c:translate (/ el mylist sset str)
  2. (command "cmdecho" "0")
  3. (command "_.undo" "begin")
  4. (setq mylist '(("APPLE" "PEAR") ("STRAWBERRY" "BANANA")))
  5. (if (setq sset (ssget ":L" '((0 . "TEXT"))))
  6.    (foreach e (vl-remove-if 'listp (mapcar 'cadr (ssnamex sset)))
  7.      (setq str (cdr (assoc 1 (setq el (entget e)))))
  8.      (foreach item mylist
  9. (if (vl-string-search (car item) str)
  10.   (progn (while        (vl-string-search (car item) str)
  11.            (setq str (vl-string-subst (cadr item) (car item) str))
  12.          )
  13.          (entmod (subst (cons 1 str) (assoc 1 el) el))
  14.   )
  15. )
  16.      )
  17.    )
  18. )
  19. (command "cmdecho" "1")
  20. (command "_.undo" "end")
  21. (princ)
  22. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:30:07 | 显示全部楼层
这个子功能可能很方便,但我无法在ATM上测试它:
 
  1. ; (_ReplaceWords
  2. ; "APPLE IS MY FAVOURITE FRUIT BUT I HAVE ONLY STRAWBERRYS"
  3. ; '(("APPLE" "PEAR") ("STRAWBERRY" "BANANA"))
  4. ; )
  5. (defun _ReplaceWords ( str aL )
  6. (mapcar     
  7.    '(lambda (old new) (while (vl-string-search old str) (setq str (vl-string-subst new old str))))
  8.    (mapcar 'car aL) (mapcar 'cadr aL)
  9. )
  10. str
  11. ); defun _ReplaceWords
回复

使用道具 举报

9

主题

33

帖子

23

银币

初来乍到

Rank: 1

铜币
47
发表于 2022-7-5 16:33:01 | 显示全部楼层
非常感谢大家,这是完美的工作!
回复

使用道具 举报

18

主题

1529

帖子

973

银币

中流砥柱

Rank: 25

铜币
649
发表于 2022-7-5 16:42:35 | 显示全部楼层
注:
如果新字符串包含旧字符串:'(“APPLE”“APPLES”),
  1. (while (vl-string-search old str) ...)
是有问题的。
 
以下是我的建议:
  1. ; (String_Subst "aabbaacc" "aa" "xx")   => "xxbbxxcc"
  2. ; (String_Subst "aabbaacc" "aa" "xxaa") => "xxaabbxxaacc"
  3. (defun String_Subst (str old new / idx)
  4. (setq idx 0)
  5. (while (setq idx (vl-string-search old str idx))
  6.    (setq str (vl-string-subst new old str idx))
  7.    (setq idx (+ idx (strlen new)))
  8. )
  9. str
  10. )
回复

使用道具 举报

58

主题

3353

帖子

33

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1761
发表于 2022-7-5 16:52:21 | 显示全部楼层
 
很好,罗伊
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:06:06 | 显示全部楼层
 
谢谢你,罗伊,我没有想到这个问题!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 20:15 , Processed in 0.550037 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表