View Full Version : Reguläre Ausdrücke mit Replace: suche Beispiel
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.
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.
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.
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.
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
Dabei ist das Problem bei Sonderzeichen mit abweichender CCSID zur Laufzeit nicht zu verachten.
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.
SQL-Funktionen lassen sich auch direkt ohne Cursor verwenden:
exec sql set : MyVar = replace(...);