1

我正在尝试计算额外空格的数量,包括字符串中的尾随和前导空格。那里有很多建议,但没有一个能完全正确地计算出来。

示例(_ 表示空格)

__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 个空格。)

4

3 回答 3

2

尝试

$_[0] =~ m/^\s|(?<=\s)\s|\s(?=\s*$)/g

这应该匹配

  1. 第一个空格(如果存在),
  2. 跟随一个空间的每个空间,
  3. 以及紧跟最后一个非空格的一个尾随空格(其余尾随空格已被第二种情况计算在内)。

换句话说,对于您的示例,这三种情况中的每一种都将匹配:

__this is a string _with extra spaces__
12                 2                 32

这也适用于所有空间的边缘情况:

_____
12222
于 2013-11-15T09:02:25.093 回答
0

此正则表达式应匹配所有不必要的单个空格

^( )+|( )(?= )|( )+$

或者

$_[0] =~ m/^( )+|( )(?= )|( )+$/g

您可以将空格更改为 \s 但它也会计算制表符。

使用正则表达式

分解:

^( )+匹配连接到行首的任何空格

( )(?= )匹配紧跟另一个空格的任何空格

( )+$匹配连接到行尾的任何空格

于 2013-11-15T09:01:05.973 回答
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";
于 2013-11-15T12:46:11.387 回答