2013-11-15 36 views
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個空格。)

+1

側面說明; '$ meaningful'變量總是比'$ _ [0]'和'M'是隱含/不需要''/../ +1 –

回答

2

嘗試

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

這應該與

  1. 第一空間(如果存在的話),
  2. 每個隨後的空間的空間,
  3. 和緊跟一個後空間最後一個非空格(其餘的空格已由第二個空格計算)。

換句話說,對於你的例子,這裏就是每個三種情況將匹配:

__this is a string _with extra spaces__ 
12     2     32 

這也適用於所有空間的邊緣情況:

_____ 
12222 
+1

,但可以將其縮短爲'M /(?<!\ S)\ S?| \ S(= \ s * $)/ g' –

+0

所有的解決方案中,我不知道這是最優雅的,但是這無疑是最接近我原來的發言。謝謝。 – Agargara

0

此正則表達式應該匹配所有不必要的個人空間

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

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

你可以改變的空間,以\ S,但隨後」我也會計算標籤。

Working on RegexPal

擊穿:

^()+匹配連接到線路

()(?=)比賽開始任何空間,後面緊跟另一個空間

()+$匹配任何任何空格連接到線路末端的空間

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