在perl中,我想替换任何不是[A-Z]i
或[0-9]
的字符,并将其替换为“_”,但前提是这个非字母数字字符出现在两个字母数字字符之间。我不想在字符串的开头或结尾处触及非字母数字。
我知道足够的正则表达式来替换它们,只是不要只替换字符串中间的那些。
答案 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;