我正在尝试计算额外空格的数量,包括字符串中的尾部和前导空格。那里有很多建议,但没有一个能完全正确地计算。
示例(_表示空格)
__this is a string__with extra spaces__
应该匹配5个额外的空格。
这是我的代码:
if (my @matches = $_[0] =~ m/(\s(?=\s)|(?<=\s)\s)|^\s|\s$/g){
push @errors, {
"error_count" => scalar @matches,
"error_type" => "extra spaces",
};
}
这个正则表达式的问题是它在中间计算两次空格。 但是,如果我拿出一个前瞻/后视比赛,就像这样:
$_[0] =~ m/\s(?=\s)|^\s|\s$/g
它不会在字符串的开头计算两个额外的空格。 (我的测试字符串只能匹配4个空格。)
答案 0 :(得分:2)
尝试
$_[0] =~ m/^\s|(?<=\s)\s|\s(?=\s*$)/g
这应该匹配
换句话说,对于您的示例,以下是三种情况中的每一种都匹配的内容:
__this is a string _with extra spaces__
12 2 32
这也适用于所有空格的边缘情况:
_____
12222
答案 1 :(得分:0)
此正则表达式应匹配所有不必要的单个空格
^( )+|( )(?= )|( )+$
或
$_[0] =~ m/^( )+|( )(?= )|( )+$/g
您可以将空格更改为\ s,但它也会计算标签。
<强>故障:强>
^( )+
匹配连接到行首
( )(?= )
匹配紧跟其他空格的任何空格
( )+$
匹配连接到行尾的所有空格
答案 2 :(得分:0)
使用三个简单的正则表达式(为了清晰起见,用下划线替换空格),您可以使用:
use strict;
use warnings;
my $str = "__this_is_a_string__with_extra_underscores__";
my $temp = $str;
$temp =~ s/^_+//;
$temp =~ s/_+$//;
$temp =~ s/__+/_/g;
my $num_extra_underscores = (length $str) - (length $temp);
print "The string '$str' has $num_extra_underscores extraunderscores\n";