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.
Arguments
Both 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:
- A direct coded string like "Test String".
- A variable containing a string.
- The result of a function call as a string value.
<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 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.
Result
A newly created single dimensional list containing strings extracted from the original string. Each are the consecutive characters matching into a single group.
Code
(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))
)
Examples
Group all alphabetic and numerals separate from other characters.
(string-split-groups " B01 - B02" '("@" "#")) ; --> (" " "B" "01" " - " "B" "02")