Zeichen löschen

Hallo zusammen,
ich suche eine elegante Möglichkeit aus einer Char-Variable alle schlechten Zeichen rauszulöschen. Also nur die guten Zeichen übrigzulassen, also nur a-z, A-Z, 0-9 (ggf. auch den _) zuzulassen.

data aaa;
string1="4decors@busmail.net";
string2=compress(translate(string1, " ", "abcdefghijklmnopqrstuvwxyz0123456789"));
put string1= string2=;
run;

Leider ist diese Lösung genau verkehrt herum. Sie löscht alle guten Zeichen raus und läßt die schlechten Zeichen übrig ....

Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Wie wäre es denn hiermit...

data aaa;
RegExpId=prxparse('s/\W//');
string1="4decors@busmail.net";
call prxchange(RegExpId, -1, string1);
put string1;
run;

Das Ergebnis lautet "4decorsbusmailnet" Also alle gute Zeichen sind drin.

\W findet alle Zeichen außer non-word character, nonalphanumeric character, und entfernt das _

Also bleiben alle guten Zeichen enthalten!!!

Grüße
Niko

Geht auch mit compress

Hallo Herr Kneilmann,

die Funktion compress hat noch zwei weitere Parameter.

data aaa;
string1="4Decors@busmail.net";
string2=compress(string1,,"NK");
put string1=;
put string2=; /*Englische Zeichen, Zahlen, Unterstrich)*/
run;

Im zweiten Parameter kann man eine Liste von Buchstaben definieren, so wie Sie es bei Translate gemacht haben. Im dritten Parameter kann man ganze Gruppen von Zeichen hinzufügen.
N steht für alle englischen Buchstaben, Zahlen und den Unterstrich.
K sorgt dafür, dass die Zeichen der Liste nicht entfernt sondern behalten werden.
\W in der Funktion PRXChange entfernt nicht den Unterstrich.
Falls der Unterstrich ein Problem ist, kann man

data aaa;
string1="4Deco_rs@busmail.net";
string2=compress(compress(string1,,"NK"),"_");
string3=prxchange("s/[^a-zA-Z0-9]//",-1,string1);
put string1=;
put string2=; /*Englische Zeichen, Zahlen */
put string3=; /*Englische Zeichen, Zahlen */
run;

schreiben.

Schöne Grüße

Jan

Stimmt!

Hi Jan,

wie es aussieht habe ich mal wieder zu schnell über die Hilfe gelesen und auch nicht passend getestet...Mit "exclude the underscore" wird das Zeichen einfach ignoriert anstatt, wie ich dachte, es wird explizit entfernt!

Tables of Perl Regular Expression (PRX) Metacharacters

Jedenfalls hast du Recht. Danke!

Grüße
Niko

Danke!

Hallo,
danke für die Lösungen.
Das die compress-Funktion mehr kann als nur Leerzeichen löschen vergesse ich immer wieder ....
Vieleicht bleibt es jetzt hängen :-)
Die Lösung mit den regulären Ausdrücken ist super!
Mit den neuen PRX-Funktionen bin ich noch nicht so ganz vertraut, mir war das die ganze Zeit zu umständlich mit dem RegExpId=prxparse(); bzw. dem if _N_ eq 1 then RegExpId=prxparse();.
Die direkte Variante prxchange("s/[^a-zA-Z0-9]//",-1,string1); ist mir da schon viel sympatischer (und als altem Unix-Shell-Scipter auch vetrauter).

Danke und Gruß
Hans Kneilmann, Schäfer Shop GmbH (SSI)

Hallo Herr Kneilmann, SAS

Hallo Herr Kneilmann,

SAS schreibt dazu in der Hilfe:

If perl-regular-expression is a constant or if it uses the /o option, the Perl regular expression is compiled only once. Successive calls to PRXPARSE will not cause a recompile, but will return the regular-expression-id for the regular expression that was already compiled. This behavior simplifies the code because you do not need to use an initialization block (IF _N_ =1) to initialize Perl regular expressions.

Dieses Verhalten gilt für alle PRX-Funktionen.

Schöne Grüße

Jan

Noch mal danke

Hallo Jan,
das vereinfacht wirklich den Code. Dafür noch mal Danke. Diese Info ist echt hilfreich. Manchmal machen sich fehlende Release-Wechsel-Kurse doch bemerkbar ...

Gruß
Hans