如何将特殊字符替换为下划线(_)perl

时间:2016-03-11 09:39:23

标签: regex linux perl

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

1 个答案:

答案 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。根据您的描述,这似乎是您想要的。如果没有,那么......它可能更容易:

_

而不是制作更复杂的模式。