| 
本帖最后由 st788796 于 2018-11-26 20:37 编辑
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
    
 Call the function string-split-groups to split a string into a list of strings grouped by ranges of characters found consecutively in the original string. E.g. say you want the alphabetic and numeric characters extracted from a string like "AF023-BZ056" into a list like ("AF" "023" "-" "BZ" "056") for easier manipulations like incrementing.Note: This function uses VisualLisp codes (if existing) which may not be available in your version of CAD. It has only been tested on full AutoCAD 2008-2012 running in Windows XP-32bit & Windows 7 - 64 bit. If your version of CAD does not contain the visual lisp functions required, then a less efficient (AutoLisp-only) method will be used to calculate the groups.
 Syntax(string-split-groups <string> <groups>) --> (<grouping1> <grouping2> ... <groupingN>)
 
 Returns a newly created list containing strings grouped by the specified ranges of characters.ArgumentsBoth these arguments are treated as by-value calls. Ensure you don't send quoted symbols as they might be altered inside the function.
 <string>Required value of the original string. It can be any of the following:
 
 <groups>Required list containing wcmatch patterns for each group to split the string into. The pattern must be in a form matching a single character. Any characters found in the string, not matching any of the specified groups will be deemed to be in a default group. It can be any of the following:A direct coded string like "Test String".A variable containing a string.The result of a function call as a string value.
 
 ResultA newly created single dimensional list containing strings extracted from the original string. Each are the consecutive characters matching into a single group.A direct quoted list like '("@" "#").A variable containing a list.A list created from direct coded strings, string results from a function call and / or variables like (list "[- _]" digits (roman-numerals))The result of a function call as a list of strings containing these groups.
 
 
  
(defun string-split-groups (string groups / temp char last-group result test-groups found
                           )
  (if (and vl-position)
    (defun test-groups (char /)
      (vl-position
        t
        (mapcar (function (lambda (grp) (wcmatch char grp))) groups)
      )
    )
    (defun test-groups (char / n)
      (setq n 0)
      (while (and (< n (length groups))
                  (not (wcmatch char (nth n groups)))
             )
        (setq n (1+ n))
      )
      (if (< n (length groups))
        n
      )
    )
  )
  (if (> (strlen string) 0)
    (setq last-group (test-groups (setq char (substr string 1 1)))
          temp       char
          string     (substr string 2)
    )
  )
  (while (> (strlen string) 0)
    (if (/= last-group
            (setq found (test-groups (setq char (substr string 1 1))))
        )
      (setq result     (cons temp result)
            temp       ""
            last-group found
      )
    )
    (setq temp   (strcat temp char)
          string (substr string 2)
    )
  )
  (reverse (cons temp result))
)
ExamplesGroup all alphabetic and numerals separate from other characters.
 (string-split-groups " B01 - B02" '("@" "#")) ; --> (" " "B" "01" " - " "B" "02")
 
 
 
 |