seth: regexp: nur bestimmte worte ersetzen

Beitrag lesen

gudn tach!

Ich habe folgenden String und möchte diese Begriffe finden und per RegEx umformen. Nur Key soll Key bleiben

XY.Bla, Hallo, a.Test, Key

Das ist nach meinem verständnis richtig, aber scheinbar ist es das nicht.

([a-zA-Z]+.)?[(^(Key))a-zA-Z]+

([a-zA-Z]+.)  heisst "mind. ein buchstabe, gefolgt von einem punkt"
?              oder nicht.

[              leitet eine zeichenklasse ein.
(^(Key))a-zA-Z ist dasselbe wie
()^a-zA-Z      , weil nur eine _zeichen_klassen-definition erfolgt.

[()^a-zA-Z]+   matcht also auf einen string, der nur aus genannten zeichen besteht und mind. ein zeichen lang ist.

das ganze ist also fern von dem, was du eigentlich willst.

wenn du alle worte ersetzen willst, die nicht "Key" sind, dann kannst du es mal mit (perl-syntax)

s/\b(?!Key)[a-zA-Z]+\b/foo/g;

probieren. "\b" matcht wortgrenzen. (?!Key) ist eine zero-width negative look-ahead assertion (siehe perldoc perlre).

aus
  XY.Bla, Hallo, a.Test, Key
wuerde damit
  foo.foo, foo, foo.foo, Key

allerdings wuerde z.b. KeyXY auch nicht ersetzt werden. sollte auch dies ersetzt werden, so wuerde ein weiterer einsatz von "\b" das erreichen:
  s/\b(?!Key\b)[a-zA-Z]+\b/foo/g;

ach so.
s/foo/bar/g in perl ist in php ungefaehr preg_replace('/foo/g', 'bar').

prost
seth