Regulärer Ausdruck
Werner
- programmiertechnik
Hi,
Ich möchte Sonderzeichen in einem Text genau dann entfernen, wenn sie nicht mehrfach hintereinander vorkommen, also
abc**def#*+gh i ==> keine Ersetzung
abc*def+gh i ==> abcdefghi.
Ich habe es zuletzt mit s/\W{1}//g versucht,
da werden aber alle Sonderzeichen ersetzt.
Wie kann ich das Gewünschte erreichen?
Schönen Sonntag
Werner
Ich möchte Sonderzeichen in einem Text genau dann entfernen, wenn sie nicht mehrfach hintereinander vorkommen, also
abc**def#*+gh i ==> keine Ersetzung
abc*def+gh i ==> abcdefghi.
Ich habe es zuletzt mit s/\W{1}//g versucht,
da werden aber alle Sonderzeichen ersetzt.
\W ist eine sehr Server spezifische Definiton von Sonderzeichen
s/\W\W+//g;
oder
s/\W{2,}//g; # 2 und mehr
erledigen den Job
Dein Anliegen ist in meinen Augen bizarr, weil ohne Strategie.
mfg Beat
Hi,
Dein Anliegen ist in meinen Augen bizarr, weil ohne Strategie.
Nicht alles was bizarr erscheint, ist es auch. Das was ich wollte, ereiche ich damit.
Daher Dank für die Hilfe.
Werner
Hi,
da war ich doch zu schnell.
Dein Beispiel löscht wenn mehr als 2 Sonderzeichen, aber nicht, wenn genau ein Zeichen.
da war ich doch zu schnell.
Dein Beispiel löscht wenn mehr als 2 Sonderzeichen, aber nicht, wenn genau ein Zeichen.
Sag ich doch.
Also du willst \W löschen unter der Voraussetzung das ihm entweder ^ oder \w vorangeht, und unter der Voraussetzung dass ihm \w oder $ folgt.
s/(^|\w)\W($|\w)/$1$2/g;
sehr unelegant
s/(?<!\W)\W(?!\W)//g;
Da stellt sich nur die Frage, ob das deine Sprache unterstützt.
mfg Beat
Hi,
Also du willst \W löschen unter der Voraussetzung das ihm entweder ^ oder \w vorangeht, und unter der Voraussetzung dass ihm \w oder $ folgt.
Ja.
s/(^|\w)\W($|\w)/$1$2/g;
sehr unelegant
s/(?<!\W)\W(?!\W)//g;
Welches der beiden Beispiele meintest Du, sei unelegant?
Das erste Beispiel ersetzt bei mir trotz "g" nur das erste Auftreten
(a*u*t*o ==> au*t*o)
Gruß
Werner
Also du willst \W löschen unter der Voraussetzung das ihm entweder ^ oder \w vorangeht, und unter der Voraussetzung dass ihm \w oder $ folgt.
Ja.s/(^|\w)\W($|\w)/$1$2/g;
sehr unelegant
s/(?<!\W)\W(?!\W)//g;
Welches der beiden Beispiele meintest Du, sei unelegant?
Das erste Beispiel ersetzt bei mir trotz "g" nur das erste Auftreten
(a*u*t*o ==> au*t*o)
Tja die erste Version versagt, wenn zwischen zwei \W nur ein \w ist.
Das liegt daran, dass die Position des Matches durch das Capturing zu weit vorrückt. Da müsste man noch mit dem \G Anker arbeiten.
Versuche die zweite Version.
mfg Beat
Versuche die zweite Version.
Ja, die funktioniert, danke!
Werner