使用 Perl 计算字符串中的非特殊字符

Using Perl to count non-special characters in a string

我试图让 Perl 只计算非特殊字符(例如在美式键盘上可以找到的字符:数字字母、%$#() 等)

my $stg = "é§I¥3§";

对于上面的字符串,我尝试了几个线程示例,例如:

my $char_count = () = $stg =~ /[[:alpha:]]/;
my $char_count = () = $stg =~ /[a-zA-Z0-9_]/;
my $char_count = () = $stg =~ /[^a-zA-z0-9_]*$/;

当我要找的答案是:2(只计算 'I' 和“3”)时,他们都给我 1。谁能告诉我正确的解决方案是什么?

你总是得到 1,因为你的正则表达式在第一次匹配后停止。如果将 //g modifier (“全局匹配”)添加到最后 2 个正则表达式,您将得到 2:

my $char_count = () = $stg =~ /[a-zA-Z0-9_]/g;

my $char_count = () = $stg =~ /[^a-zA-z0-9_]*$/g;

:alpha: 正则表达式只匹配 I,不匹配 3。它会 return 1 即使 //g:

alpha  Any alphabetical character (e.g., [A-Za-z]).

音译是另一种计数方法。使用 /c 标志,它使用您指定的字符的补码:

my $non_ascii_count = $stg =~ tr/a-zA-Z0-9_//c;