Anmelden

View Full Version : Reguläre Ausdrücke mit Replace: suche Beispiel



edv90020
13-04-11, 09:46
Hallo zusammen,

ich habe im ILE-RPG Umfeld noch nicht mit REGEX (z.B. C Routine regcomp, regexec, ...) gearbeitet. Ich möchte eigentlich ungültige Zeichen in einem String mit einem Leerzeichen ersetzen. Hat jemand ein Beispielprogramm ? Über GOOGLE bin ich nicht wirklich fündig geworden.

Fuerchau
13-04-11, 10:36
Nun ja, da ist der %xlate(From:To:Var) eigentlich der schnellste Weg, da du ja Leerzeichen haben willst.

Was auch genauso schnell ist, ist eine kleine eigene Schleife:

d Pos 5I 0
d Var 100
for Pos = 1 to %size(Var)
if %check('gültige Zeichen':%subst(Var:Pos:1)) > 0;
%subst(Var:Pos:1)=*blank;
endif;
endfor;

Den Overhead mit RegEx würde ich bei so einfachen Sachen lassen.

edv90020
13-04-11, 10:48
Nun ja, so kann man das Problem jetzt auch lösen.

Ich werde zukünftig auch öfteres mal über diese Problematik stolperen da würd es mich schon interessieren wie ich das mit RegEx machen könnte.

Fuerchau
13-04-11, 11:16
Hier gibts einen längeren Beitrag dazu:
http://newsolutions.de/forum-systemi-as400-i5-iseries/newsboard-programmierung/15329-regex-ccsid.html?highlight=regex

Insbesonders ist auf die CCSID-Problematik zu achten.
Der Rest steht eigentlich im C-Handbuch.
Allerdings kann ich keine Replace-Funktion finden.
Hierfür musst du ggf. die %Replace()-BuiltIn bzw. "%subst(Var:Pos:Size) = NewValue" verwenden, nach dem du einen Match (Position und Länge) gefunden hast.

Khholm
14-04-11, 06:42
es geht noch einfacher:

definiere 2 Strings, einmal mit den zu ersetzenden Zeichen, einmal mit den Ersatzzeichen (in diesem Fall blanks) und nutze dann %xlate
<!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Normale Tabelle"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--> d low c 'zäöü'
d trans c '

dattest = %xlate(low:trans:dattest);


es werden die in low definierten Zeichen in dattest durch die entsprechenden aus trans ersetzt.


gruß

kh

Fuerchau
14-04-11, 08:24
Dabei ist das Problem bei Sonderzeichen mit abweichender CCSID zur Laufzeit nicht zu verachten.

MGJ79
19-04-11, 20:54
eine Idee wäre da noch die SQL-Replace Funktion:

Select Replace('abc', 'b' , 'bee') as erg from sysibm.sysdummy1;


Das kann man relativ einfach verwursten. Ist wahrscheinlich nicht die Performanste Lösung aber sollte klappen.

Fuerchau
20-04-11, 07:45
SQL-Funktionen lassen sich auch direkt ohne Cursor verwenden:

exec sql set : MyVar = replace(...);