找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 268|回复: 1

[字符串] XD::STR:m-find

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2025-4-17 16:05:33 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::STR:m-find
调用格式: (XD::STR:m-find a b)
参数说明: a - 要查找的子字符串(区分大小写)。
Substring to search for (case-sensitive).
b - 要搜索的目标字符串。
The target string where the search is performed.
返回值: 【返回值 / Return Value】
返回一个整数列表,表示 A 在 B 中所有出现的位置(以 1 为起始)。
函数简介: 【功能说明 / Description】
查找目标字符串 B 中所有等于子串 A 的起始位置索引。
Finds all starting positions of substring A in string B.
函数来源: 二次修改
函数作者: marting
适用版本: 不限 
最后更新时间: 2025-04-17
备注: -
演示图片: -

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  1. ;;; ------------------------------------------------------------------------
  2. ;;; 函数名称 / Function Name: XD::STR:m-find
  3. ;;;
  4. ;;; 【功能说明 / Description】
  5. ;;;     查找目标字符串 B 中所有等于子串 A 的起始位置索引。
  6. ;;;     Finds all starting positions of substring A in string B.
  7. ;;;
  8. ;;; 【参数说明 / Parameters】
  9. ;;;     a - 要查找的子字符串(区分大小写)。
  10. ;;;         Substring to search for (case-sensitive).
  11. ;;;     b - 要搜索的目标字符串。
  12. ;;;         The target string where the search is performed.
  13. ;;;
  14. ;;; 【返回值 / Return Value】
  15. ;;;     返回一个整数列表,表示 A 在 B 中所有出现的位置(以 1 为起始)。
  16. ;;;     Returns a list of integers indicating the 1-based positions of A in B.
  17. ;;;
  18. ;;; 【使用示例 / Example Usage】
  19. ;;;     (XD::STR:m-find "AB" "ABCABC")  => '(1 4)
  20. ;;;     (XD::STR:m-find "," "A,B,C,")   => '(2 4 6)
  21. ;;;
  22. ;;; 【备注 / Notes】
  23. ;;;     - 若 A 为空字符串,返回 nil。
  24. ;;;       Returns nil if A is an empty string.
  25. ;;;     - 若 B 不是字符串类型,也返回 nil,并输出错误信息。
  26. ;;;       Returns nil and prints an error if B is not a string.
  27. ;;; ------------------------------------------------------------------------

  28. (defun XD::STR:m-find (a b / c n)
  29.   (cond
  30.     ((= "" a)
  31.      ;; A 为空,直接返回 nil / Empty substring
  32.      (setq c nil)
  33.     )

  34.     ((/= 'str (type b))
  35.      ;; B 不是字符串类型 / Type check failed
  36.      (print "ARGUMENT NOT A STRING!!!!")
  37.      (print b)
  38.      (setq c nil)
  39.     )

  40.     (t
  41.      ;; 开始查找匹配 / Start scanning
  42.      (setq n 1)
  43.      (while (and (>= (+ (- (strlen b) n) 1) (strlen a)))
  44.        (if (= (substr b n (strlen a)) a)
  45.          (progn
  46.            ;; 找到匹配,记录位置 / Match found
  47.            (setq c (append c (list n)))
  48.            ;; 跳过当前匹配长度,防止重叠匹配 / Skip over match length
  49.            (setq n (- (+ n (strlen a)) 1))
  50.          )
  51.        )
  52.        (setq n (1+ n))
  53.      )
  54.     )
  55.   )
  56.   c
  57. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 4个

财富等级: 恭喜发财

发表于 2025-4-18 22:18:54 | 显示全部楼层
谢谢马丁大佬分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-7 06:13 , Processed in 0.224266 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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