my @folder = ('s,c%','c__pp_p','Monday_øå_Tuesday, Wednesday','Monday & Tuesday','Monday_Tuesday___Wednesday');
if ($folder =~ s/[^\w_*\-]/_/g ) {
$folder =~ s/_+/_/g;
print "$folder : Got %\n" ;
}
使用上面的代码我无法处理这个“Monday_øå_Tuesday_Wednesday”
输出应为:
s_c
c_pp_p
Monday_øå_Tuesday_Wednesday
Monday_Tuesday
Monday_Tuesday_Wednesday
答案 0 :(得分:2)
您可以使用\W
来否定\w
字符类,但您遇到的问题是\w
与您的非ascii字母不匹配。
所以你需要做这样的事情:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @folder = ('s,c%','c__pp_p','Monday_øå_Tuesday, Wednesday','Monday & Tuesday','Monday_Tuesday___Wednesday');
s/[^\p{Alpha}]+/_/g for @folder;
print Dumper \@folder;
输出:
$VAR1 = [
's_c_',
'c_pp_p',
'Monday_øå_Tuesday_Wednesday',
'Monday_Tuesday',
'Monday_Tuesday_Wednesday'
];
这使用了unicode属性 - perldoc perluniprop
中记录了这些属性 - 但它的长短不一,\p{Alpha}
是 unicode 字母数字集,非常像{ {1}}但国际化。
虽然第一行确实有一个尾随\w
。根据您的描述,这似乎是您想要的。如果没有,那么......它可能更容易:
_
而不是制作更复杂的模式。