2012-03-23 32 views
17

Ich habe dynamisch Zeichenfolgen wie @#@[email protected]!#! generiert, und ich möchte bestimmte Zeichen aus der Zeichenfolge mit Perl entfernen.Bessere Möglichkeit, bestimmte Zeichen aus einer Perl-Zeichenfolge zu entfernen

Derzeit mache ich etwas mit diesen (die Zeichen mit nichts zu ersetzen):

$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g; 

Gibt es einen besseren Weg, dies zu tun? Ich suche nach etwas sauberem.

Antwort

23

Sie haben falsch verstanden, wie character classes verwendet:

$varTemp =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g; 

macht das gleiche wie Ihre regex (vorausgesetzt, Sie nicht ' Zeichen aus der Zeichenketten entfernen wollte).

Edit: Die + ermöglicht mehrere dieser "Sonderzeichen" auf einmal zusammen, so sollte es auch schneller sein.

13

könnten Sie die tr verwenden stattdessen:

 $p =~ tr/fo//d; 

wird alle f und jedes o von $p löschen. In Ihrem Fall sollte es sein:

 $p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d 
0

Nun, wenn Sie die zufällig generierte Zeichenfolge verwenden, so dass es eine geringe Wahrscheinlichkeit hat durch eine vorsätzliche Zeichenfolge angepasst ist, die man normalerweise in den Daten finden könnte, dann sind Sie wahrscheinlich eine Zeichenfolge pro Datei.

Sie nehmen diese Zeichenfolge, rufen Sie es $place_older sagen. Und dann, wenn Sie den Text beseitigen wollen, rufen Sie quotemeta, und verwenden Sie diesen Wert zu ersetzen:

my $subs = quotemeta $place_holder; 
s/$subs//g; 
+0

Das um die nicht Wortzeichen alle werden Backslash schreiben kann. Das funktioniert nicht, wenn ich nur bestimmte Zeichen entfernen möchte. – Ron

6

Mit einer Zeichenklasse dieser große es einfacher ist, zu sagen, was Sie behalten möchten. Ein caret in der ersten Position einer Zeichenklasse invertiert seinen Sinn, so dass Sie

$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi 

oder mit Hilfe der effizienten mehr tr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd 
Verwandte Themen