Hallo zusammen,
ich hab folgendes gefunden:
String Zerlegung Buchstaben/Zahlen
Beitrag
und hab folgende drei Funktionen dazu beizutragen die alles an Strings zerlegen können was mir bisher in die Finger gekommen ist.
Bis jetzt hats funktioniert, aber wenn jemand was optimieren kann - immer her damit
Und wenns jemand brauchen kann - viel Spass damit.
Gruß
Andreas
(defun zerlege_text (text filter rückgabe)
;;; sucht alle kleinstmöglichen Teilstrings auf die der Suchfilter noch zutrifft,
;;; zerlegt den String an diesen Stellen
;;; gibt eine Liste mit Teilstrings zurück
;;;
;;; Die mit dem Suchfilter gefundenen Teilstrings werden bei:
;;; - rückgabe=0 nicht entfernt
;;; - rückgabe=1 entfernt
;;; - rückgabe=2 zurückgegeben
;;; - rückgabe=3 Daten für Befehl substr entsprechend rückgabe 0
;;; - rückgabe=4 Daten für Befehl substr entsprechend rückgabe 1
;;; - rückgabe=5 Daten für Befehl substr entsprechend rückgabe 2
;;;
;;; Die Teilstrings werden durch eine Suchmuster ermittelt dessen Aufbau unter "wcmatch" nachzulesen ist
;;; Beispiele für filter
;;; (setq filter "*#`.#*")
;;; (setq filter "*[~0-9]*")
;;; (setq filter "*[~0123456789`,]*")
;;; (setq filter "*#`.?*")
;;; (setq filter "*`,#*")
;;;
;;; benötigt werden die Unterfunktionen : mk_substr_list, wcmatch_pos
(cond
((= rückgabe 0)
(mapcar '(lambda (teil) (substr text (nth 0 teil) (nth 1 teil)))
(mk_substr_list text filter)
)
)
((= rückgabe 1)
(mapcar '(lambda (teil) (substr text (nth 0 teil) (nth 1 teil)))
(wcmatch_pos text filter)
)
)
((= rückgabe 2)
(mapcar '(lambda (teil) (substr text (nth 0 teil) (nth 1 teil)))
(vl-remove-if
'(lambda (data) (member data (wcmatch_pos text filter)))
(mk_substr_list text filter)
)
)
)
((= rückgabe 3)
(mapcar '(lambda (teil) (list (nth 0 teil) (nth 1 teil)))
(mk_substr_list text filter)
)
)
((= rückgabe 4)
(mapcar '(lambda (teil) (list (nth 0 teil) (nth 1 teil)))
(wcmatch_pos text filter)
)
)
((= rückgabe 5)
(mapcar '(lambda (teil) (list (nth 0 teil) (nth 1 teil)))
(vl-remove-if
'(lambda (data) (member data (wcmatch_pos text filter)))
(mk_substr_list text filter)
)
)
)
)
)
(defun mk_substr_list (text filter / f_list ergebniss_list pos)
;;; sucht alle kleinstmöglichen Teilstrings auf die der Suchfilter noch zutrifft,
;;; gibt eine Liste mit Listen zurück die die Werte für substr enthalten
;;; Die mit dem Suchfilter gefundenen Teilstrings werden NICHT entfernt
;;; benötigt wird die Unterfunktionen : wcmatch_pos
(if (wcmatch text filter)
(progn
(setq f_list (wcmatch_pos text filter)
pos 1
)
(foreach teil f_list
(setq start (nth 0 teil))
(if (> start pos)
(setq ergebniss_list
(cons (list pos (- start pos)) ergebniss_list)
)
)
(setq ergebniss_list (cons teil ergebniss_list)
pos (+ start (nth 1 teil))
)
)
(if
(<= (setq start (+ (nth 0 (last f_list)) (nth 1 (last f_list))))
(strlen text)
)
(setq ergebniss_list
(cons (list start nil)
ergebniss_list
)
)
)
(reverse ergebniss_list)
)
'((1 nil))
)
)
(defun wcmatch_pos (text filter / start liste inc)
;;; sucht alle kleinstmöglichen Teilstrings auf die der Suchfilter noch zutrifft,
;;; gibt eine Liste mit Listen zurück die die Werte für substr enthalten
;;; In der Rückgabeliste sind nur die Werte für die mit dem Suchfilter gefundenen Teilstrings enthalten
(defun wcmatch_pos_work (text / liste n txt)
(setq n (strlen text))
(while (and (/= (substr text 1 n) "")
(wcmatch (substr text 1 n) filter)
)
(setq n (1- n))
)
(setq txt (substr text 1 (1+ n))
n 1
)
(while (and (<= n (strlen text)) (wcmatch (substr txt n) filter))
(setq n (1+ n))
)
(setq start (1- n)
inc (+ inc start)
liste (list (list inc (strlen (substr txt start))))
inc (+ inc (1- (strlen (substr txt start))))
)
(if
(and
(/= ""
(setq
text (substr text (+ start (strlen (substr txt start))))
)
)
(wcmatch text filter)
)
(setq liste (append liste (wcmatch_pos_work text)))
)
liste
)
(setq inc 0)
(if (wcmatch text filter)
(progn
(setq liste (wcmatch_pos_work text))
)
)
liste
)
[Diese Nachricht wurde von Andreas Kraus am 24. Mrz. 2010 editiert.]
[Diese Nachricht wurde von Andreas Kraus am 12. Apr. 2010 editiert.]
[Diese Nachricht wurde von Andreas Kraus am 04. Mai. 2010 editiert.]
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP