我想洗掉除這 2 個字符之外的所有特殊字符 .-
$name=~s/[^\w\d\.-]/_/g ;
但它上面的行不僅洗掉了特殊字符,還洗掉了非字母字符,例如阿拉伯語或其他非字母字符。
如何僅洗掉這些字符 (#@#!~`%^&()[]}{;',)
uj5u.com熱心網友回復:
這里有幾件事需要考慮。
首先,做\d
并且\w
真的做你認為他們做的事?最近的 perls 可以識別 Unicode(在某些情況下還可以識別語言環境),并且這些字符類在每種情況下都不相同。
由于您知道要排除的內容,因此可以直接將其放入字符類中。您只需要轉義,]
因此它不會結束字符類:
use v5.10;
my $name = "(Hello] #&^% {World[} (#@#!~`%^&()[]}{;',)!";
$name =~ s/[(#@#!~`%^&()[\]}{;',)]/_/g;
say $name;
Mark Jason Dominus 撰寫了有關清理資料的“美國式”和“普魯士式”方法的文章。您可以指定要排除的內容或要包含的內容。
如果您指定要排除的事物,您可能會通過一些您應該排除但沒有排除的事物。這可能是因為您忘記了或者甚至不知道您應該排除它。這些意想不到的情況可能會咬你。
如果你只指定安全的東西,你可能會錯過你應該通過的東西,但糟糕的東西不會因為遺漏的錯誤而通過。
然后你可以試試這個,你不使用字符類快捷方式:
$name =~ s/[^0-9A-Za-z.-]/_/g;
但是輸出有點奇怪,因為它也替換了空格。您可以\s
在其中添加快捷方式:
$name =~ s/[^0-9A-Za-z\s.-]/_/g;
但是隨著時間的推移, 的含義\s
也發生了變化(垂直選項卡!)并且也是 Unicode 感知的。你可以列出你會接受的空格:
$name =~ s/[^0-9A-Za-z\x20.-]/_/g;
但不,這有點奇怪。還有另一種方式。您可以使用以下標志回傳字符類快捷方式的 ASCII 版本/a
:
$name =~ s/[^\d\w\s.-]/_/ga;
正則運算式運算子標志在perlop中,因為它們適用于運算子。但是,只要我一直在使用 Perl 并告訴課堂上的人,我仍然會先去perlre。
音譯
其次,替換運算子可能比您需要的要多。如果你想把單個字符變成其他單個字符,音譯運算子可能就是你需要的。它將左側的字符更改為右側的相應字符:
$name =~ tr/abc/XYZ/; # a -> X, b -> Y, c -> Z
如果您沒有足夠的字符來匹配右側,它會重用最后一個字符:
$name =~ tr/abc/XY/; # a -> X, b -> Y, c -> Y
所以,在你的情況下,有一個下劃線:
$name =~ tr/@#!~`%^&()[]}{;',/_/;
由于其中的字符序列tr///
不是正則運算式,因此您不必擔心元字符。
只為歡笑
如果您想在多個地方使用此模式,您可能希望使用用戶定義的 Unicode 屬性為其命名。一旦有了名字,你就可以在任何地方使用它,并且可以同時為每個人更新:
use v5.10;
my $name = "(Hello] #&^% {World[} (#@#!~`%^&()[]}{;',)!";
$name =~ s/\p{IsForbidden}/_/g;
say $name;
sub IsForbidden {
# see https://perldoc.perl.org/perlunicode#User-Defined-Character-Properties
state $exclude = q|@#!~`%^&()[]}{;',|;
state $string =
join '',
map { sprintf "%X\n", ord }
split( //, $exclude );
return $string;
}
uj5u.com熱心網友回復:
基于 Gene 的評論,指定您要替換的內容,但我會轉義每個特殊字符。注意,要替換 #,請在字符陣列中使用 \#\#,如第 2 行所示:
$name = "@ # R ! ~## ` % ^ & ( O ){{();,'`@@ { } ;!!! ' N , ";
$name =~ s/[\@\!\~\`\%\&\^\(\)\{\}\;\'\,\#\#]//g;
$name =~ s/ *//g;
print $name;
### Outputs RON
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/467173.html
標籤:perl
上一篇:如果與/||/&&在perl中