正则表达式查找额外空格的数量,包括尾随和前导空格

时间:2013-11-15 08:55:26

标签: regex perl

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

示例(_表示空格)

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

3 个答案:

答案 0 :(得分:2)

尝试

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

这应该匹配

  1. 第一个空格(如果存在),
  2. 空格后面的每个空格
  3. 并且紧跟在最后一个非空格之后的一个尾随空格(其余的尾随空格已经被第二种情况计算)。
  4. 换句话说,对于您的示例,以下是三种情况中的每一种都匹配的内容:

    __this is a string _with extra spaces__
    12                 2                 32
    

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

    _____
    12222
    

答案 1 :(得分:0)

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

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

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

您可以将空格更改为\ s,但它也会计算标签。

Working on RegexPal

<强>故障:

^( )+匹配连接到行首

的所有空格

( )(?= )匹配紧跟其他空格的任何空格

( )+$匹配连接到行尾的所有空格

答案 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";