Schrift
[thread]8334[/thread]

regex: einzelnes zeichen ersetzen, doppeltes nicht

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2006-09-15 13:25
#69909 #69909
Hallo regex-Gurus!

In einem String müssen ein bestimmtes Zeichen, wenn es alleine steht, ausgetauscht werden. Steht es doppelt nebeneinander dann nicht.

z.B. "+" soll gegen "q" getauscht werden

gegeben: 123+456++78+90++
Ergebnis: 123q456++78q90++

Ich finde keine regex die das hinkriegt. Hat jemand eine Idee ?

uger
renee
 2006-09-15 13:36
#69910 #69910
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my $string = '123+456++78+90++';
my $zeichen = '+';

$string =~ s/(\Q$zeichen\E{1,2})/length $1 == 2 ? $1 : 'q'/eg;
print $string;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
uger
 2006-09-15 14:21
#69911 #69911
User since
2006-09-15
2 Artikel
BenutzerIn
[default_avatar]
renee: Super!

Musste mich gerade nur registrieren um Dir meinen Dank auszusprechen. Funktioniert!

Ich werden dann mal versuchen es nachzuvollziehen.
Schöne Hausaufgabe fürs Wochenende.

uger
topeg
 2006-09-16 08:18
#69912 #69912
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Es geht auch anders:
Hier zwei Möglichkeiten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

my $s='123+456++78+90++';
my $z='\+'; # "+" ist ein Suchzeichen in Regulären Ausdrücken und muß mit "\" auskommentiert werden.
my $e;
print "$s\n";

# mit Permatching
($e=$s)=~s/(?<=[^$z])$z(?=[^$z])/q/g;
print "$e\n";

# mit Ersetzung
($e=$s)=~s/([^$z])$z([^$z])/$1q$2/g;
print "$e\n";
\n\n

<!--EDIT|topeg|1158380960-->
Dubu
 2006-09-16 18:33
#69913 #69913
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=topeg,16.09.2006, 06:18]Es geht auch anders:
Hier zwei Möglichkeiten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

my $s='123+456++78+90++';
my $z='\+'; # "+" ist ein Suchzeichen in Regulären Ausdrücken und muß mit "\" auskommentiert werden.
my $e;
print "$s\n";

# mit Permatching
($e=$s)=~s/(?<=[^$z])$z(?=[^$z])/q/g;
print "$e\n";

# mit Ersetzung
($e=$s)=~s/([^$z])$z([^$z])/$1q$2/g;
print "$e\n";
[/quote]
Deine Regexen schlagen beide fehl, wenn das zu ersetzende Zeichen am Anfang oder am Ende des Strings auftaucht. Es muss aber bei beiden Varianten nicht viel geändert werden.

Dein Lookbehind "(?<=[^$z])" heißt soviel wie "vor dem Folgenden muss ein Zeichen sein, das kein $z ist". Wenn man stattdessen "(?<!$z)" nimmt, bedeutet das "vor dem Folgenden darf kein $z sein", was auch für den Stringanfang zutrifft und außerdem auch noch klappt, wenn $z eine längere Zeichenkette ist. Analog kann man für das Stringende einen negativen Lookahead nehmen: "(?!$z)".

Für die Ersetzungsvariante müssen einfach die Regeln vorne und hinten noch um Stringanfang bzw. Stringende ergänzt werden.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
use strict;
use warnings;

for my $s (qw/123+456++78+90++ +123++456+78++90+/) {
   my $z='\+'; # "+" ist ein Suchzeichen in Regulären Ausdrücken und muß mit "\" auskommentiert werden.
   my $e;

   # topeg mit Permatching
   ($e=$s)=~s/(?<=[^$z])$z(?=[^$z])/q/g;
   print "topeg mit Prematching:\n$s => $e\n";

   # topeg mit Ersetzung
   ($e=$s)=~s/([^$z])$z([^$z])/$1q$2/g;
   print "topeg mit Ersetzung:\n$s => $e\n";

   # Dubu mit negativem Lookbehind/-forward
   ($e=$s)=~s/(?<!$z)$z(?!$z)/q/g;
   print "Dubu mit negativem Lookbehind/-forward:\n$s => $e\n";

   # Dubu mit erweiterter Ersetzung
   ($e=$s)=~s/(^|[^$z])$z([^$z]|$)/$1q$2/g;
   print "Dubu mit erweiterter Ersetzung:\n$s => $e\n";

   print "\n";
}
__END__
topeg mit Prematching:
123+456++78+90++ => 123q456++78q90++
topeg mit Ersetzung:
123+456++78+90++ => 123q456++78q90++
Dubu mit negativem Lookbehind/-forward:
123+456++78+90++ => 123q456++78q90++
Dubu mit erweiterter Ersetzung:
123+456++78+90++ => 123q456++78q90++

topeg mit Prematching:
+123++456+78++90+ => +123++456q78++90+
topeg mit Ersetzung:
+123++456+78++90+ => +123++456q78++90+
Dubu mit negativem Lookbehind/-forward:
+123++456+78++90+ => q123++456q78++90q
Dubu mit erweiterter Ersetzung:
+123++456+78++90+ => q123++456q78++90q
uger
 2006-09-18 19:36
#69914 #69914
User since
2006-09-15
2 Artikel
BenutzerIn
[default_avatar]
Wow, vielen Dank für die Lösungen (auch wenn sie für mich
reichlich kryptisch und verwirrend sind).

Habt ihr vielleicht noch Tips wo man eine gute Erklärung/Tutorial
für das Thema regex bekommen kann?

uger
Dubu
 2006-09-19 02:43
#69915 #69915
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
perlrequick - Kurzanleitung Reguläre Ausdrücke
perlretut - Tutorium Reguläre Ausdrücke
perlre - Reguläre Ausdrücke, der Rest
perlreref - Reguläre Ausdrücke Kurzreferenz
Strat
 2006-09-23 14:31
#69916 #69916
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
In meiner "Einfuehrung in Perl" auf meiner Homepage unter Vortraege steht auch ein klein wenig was dazu...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sabrina
 2006-09-25 13:56
#69917 #69917
User since
2006-08-03
264 Artikel
BenutzerIn
[default_avatar]
versuch mal http://download.pearsoned.de/leseeck....DF5FE2}
die seite habe ich von einem thread aus diesem forum ich finde sie recht gut und umfangreich
lg sabrina\n\n

<!--EDIT|renee|1159179487-->
renee
 2006-09-25 14:23
#69918 #69918
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@sabrina: kannst Du den Link bitte nochmal posten? Ich wollte den Link "reparieren" und habe ihn stattdessen "kaputtrepariert"... sorry
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2006-09-15 13:25.