wcmatch / Lisp
romi1 09. Sep. 2009, 08:20

Hallo!

Ich möchte mittels wcmatch einen String auf div. Sonderzeichen überprüfen:

(setq string "fj\"28")
(wcmatch string "*[[](){}<>?:"|\/* ]*")

Es soll also auf jene Zeichen, die sich innerhalb der (äußeren) eckigen Klammern befinden überprüft werden. Das klappt aber leider so nicht.

Vielleicht gibt es aber einen anderen, einfacheren Weg - ich möchte einen gegebenen String überprüfen, ob nur Buchstaben, Zahlen und noch einige Zeichen wie _ - + # . vorkommen bzw. diese Zeichen zulassen.

Hat jemand einen Tipp ?

Gruß,
Roman

CADmium 09. Sep. 2009, 08:41

vielleicht sowas
(defun ENTHAELT-SONDERZEICHEN?(STRING SONDERZEICHENSTRING)
  (> (length(vl-remove-if-not
                '(lambda(X)
                   (member X (vl-string->list SONDERZEICHENSTRING))
                 )                 
                 (vl-string->list STRING)
            )
     )
     0
  )
)
(ENTHAELT-SONDERZEICHEN?  " Alles ok " "*[[](){}<>?:\"|\\/*]*")


läßt du den length-vergleich weg , bekommst du sogar ne Liste mit den enthaltenen Sonderzeichen zurück ....

mit wcmatch auf Sonderzeichen prüfen muss ein ` vorangestellt werden

(wcmatch "N*ame" "*`**") -> T
(wcmatch "Name"  "*`**") -> nil

und noch als Ergänzung:

(defun OHNESONDERZEICHEN(STRING SONDERZEICHENSTRING)
  (setq A (vl-string->list SONDERZEICHENSTRING))
  (apply
    'strcat
    (mapcar
      'chr     
      (vl-remove-if
        '(lambda(X)
          (member X A)
        )                 
        (vl-string->list STRING)
      )
    )   
  )
)

wronzky 09. Sep. 2009, 08:54

kleine Umstellung, grosse Wirkung:

Code:
(wcmatch string "*[][(){}<>?:\"|\\/* ]*")
liefert das gewünschte Ergebnis. die schliessende Eckige Klammer ] MUSS nämlich am Anfang stehen, sonst wird sie als Ende der "oder"-Funktion angesehen.

Grüsse, Henning

romi1 09. Sep. 2009, 09:34

@ Thomas: sicher eine gute Lösung, aber mit den vl-Gschichteln kenn' ich mich leider noch nicht aus ...
@ Henning: genial !

DANKE!

Gruß, Roman