明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2687|回复: 15

[源码] 最快的字串分割方法

[复制链接]
发表于 2024-2-13 22:46:03 | 显示全部楼层 |阅读模式
本帖最后由 dcl1214 于 2024-2-19 17:58 编辑

不知道这是不是有史以来最快的字串分割方法,盼望大家一起来挑战
  1. ;经过测试,高老师提供的方法更快,详见11楼

  2. (defun $zi-chuan-fen-ge$ (str delim / lst i len)
  3.   (if (AND str delim (= (type str) 'str) (= (type delim) 'str))
  4.     (progn
  5.       (setq len (strlen delim))
  6.       (while (setq i (vl-string-search delim str))
  7.         (setq lst (cons (substr str 1 i) lst))
  8.         (setq str (substr str (+ 1 len i)))
  9.       )
  10.       (setq lst (cons str lst))
  11.       (reverse lst)
  12.     )
  13.   )
  14. )






"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-3-5 15:42:28 | 显示全部楼层
本帖最后由 yxp 于 2024-3-5 15:53 编辑

函数: (split str p)
用法:用 p 短字符串分割 str 长字符串,返回表,p 支持管道符多个短字符串并列
示例:(split “abcfarecadefge” “c|f”) 返回 (“ab” “are” “ade” “ge”)
(defun split (s p / r)
(setq r (vlax-create-object "vbscript.regexp"))
(vlax-put-property r 'Global 1)
(vlax-put-property r 'Pattern p)
(read (strcat "(\"" (vlax-invoke r 'Replace s "\" \"") "\")"))
)

来自:https://blog.csdn.net/yxp_xa/article/details/72636232
回复 支持 1 反对 0

使用道具 举报

发表于 2024-2-14 08:58:09 | 显示全部楼层

(defun $zi-chuan-fen-ge$ (str fgf / jg)
                                        ;字符串分割
  (if (and str (= (type str) 'str) fgf (= (type fgf) 'str))
    (progn
      (setq str (vl-prin1-to-string str))
      (while (wcmatch str (STRCAT "[,*`" FGF "*,]"))
        (setq str (vl-string-subst "\"\"" fgf str))
      )
      (setq jg (read (strcat "(" str ")")))
    )
  )
  jg
)

(defun syz-zi-chuan-fen-ge (str fgf)
                                        ;(setq fgf "明经")
  (if (and str (= (type str) 'str) fgf (= (type fgf) 'str))
    (progn
      (setq i 1
            k 1
      )
      (setq jg nil)
      (while (< i (+ 1 (- (strlen str) (strlen fgf))))

        (setq str2 (substr str i (strlen fgf)))
        (if (equal str2 fgf)
          (progn

            (setq jg (append jg (list (substr str k (- i k)))))
            (setq k (+ i (strlen fgf)))
            (setq i (+ i (strlen fgf)))
          )

          (setq i (+ 1 i))
        )

      )
    )
  )
)
(setq str "s")
(setq j 0)
(repeat        6000
  (setq        str (strcat str
                    "测试字符串1234567阿布炒大白菜的abcd"
                    (itoa j)
                    "明经"
            )
  )
  (setq j (+ 1 j))
)
(princ (strlen str))
(setq t0 (getvar "TDUSRTIMER"))
(syz-zi-chuan-fen-ge str "明经")
                                        ;($zi-chuan-fen-ge$ str "明经")
(princ "\n程序共用时")
(princ (* (- (getvar "TDUSRTIMER") t0) 86400))
(princ "秒")
(princ)
发表于 2024-2-19 14:43:13 | 显示全部楼层
本帖最后由 highflybird 于 2024-2-19 16:15 编辑
baitang36 发表于 2024-2-14 08:58
(defun $zi-chuan-fen-ge$ (str fgf / jg)
                                        ;字符串分割
  (if (and str (= (type str) 'str) fgf  ...


用read和vl-princ-to-string可能会有某些意想不到的效果。
我的代码:
  1. (defun mysplit (str delim / lst i len)
  2.   (setq len (strlen delim))
  3.   (while (setq i (vl-string-search delim str))
  4.     (setq lst (cons (substr str 1 i) lst))
  5.     (setq str (substr str (+ 1 len i)))
  6.   )
  7.   (setq lst (cons str lst))
  8.   (reverse lst)
  9. )
 楼主| 发表于 2024-2-13 22:48:41 | 显示全部楼层
如果要用 "\"来做分隔符,估计会麻烦
发表于 2024-2-14 12:21:28 | 显示全部楼层
顶一个,看高手来讨论
发表于 2024-2-14 12:36:15 | 显示全部楼层
楼主这“有史以来最快的字串分割方法”一言难尽啊,虽然清楚楼主在AutoLISP/Visual LISP 编程技术板块发的贴。
发表于 2024-2-14 14:21:17 来自手机 | 显示全部楼层
神仙约架了。。。
发表于 2024-2-14 16:10:17 | 显示全部楼层
从哪抄的代码、怎么一会大写一会小写呢
发表于 2024-2-14 17:49:12 | 显示全部楼层

神仙约架了。。。
发表于 2024-2-15 21:57:38 | 显示全部楼层
学习了,谢谢分享
发表于 2024-2-18 07:46:35 | 显示全部楼层
支持lispsys=1的情况吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 20:18 , Processed in 0.266846 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表