PERL-将任何非字母数字字符替换为“_”

时间:2011-03-08 20:41:18

标签: regex perl

在perl中,我想替换任何不是[A-Z]i[0-9]的字符,并将其替换为“_”,但前提是这个非字母数字字符出现在两个字母数字字符之间。我不想在字符串的开头或结尾处触及非字母数字。

我知道足够的正则表达式来替换它们,只是不要只替换字符串中间的那些。

2 个答案:

答案 0 :(得分:4)

s/(\p{Alnum})\P{Alnum}(\p{Alnum})/${1}_${2}/g;

当然用“#A#B%C”会伤害你的琴,所以你可以使用环顾四周:

s/(?<=\p{Alnum})\P{Alnum}(?=\p{Alnum})/_/g;

通过这种方式,您可以将其与非“alnum”字符隔离开来。

或者您可以使用“保持标志”,并完成同样的事情。

s/\p{Alnum}\K\P{Alnum}(?=\p{Alnum})/_/g;

编辑 基于输入:

如果不吃换行符,您可以执行以下操作:

s/\p{Alnum}\K[^\p{Alnum}\n](?=\p{Alnum})/_/g;

答案 1 :(得分:1)

试试这个:

my $str = 'a-2=c+a()_';
$str =~ s/(?<=[A-Z0-9])[^A-Z0-9](?=[A-Z0-9])/\1_\2/gi;