2015-11-20 90 views
-2

我有一個字符串,我想要在它的子字符串中分隔字符之間的空格,但子字符串間的空格數不應超過4個。

例如:字符串:
「黃芩素,特異性脂氧合酶(LOX)抑制劑,具有抗炎和抗氧化作用。」
所得子應該像
1. 黃芩素,
2. 黃芩素,一個
3. 黃芩素,特定
4. 黃芩素,具體的脂氧合酶
5 。黃芩素,一種特定的脂氧合酶(LOX)
6. a
7. 特定
...
我覺得必須有某種方式與正則表達式,但我不知道

從Perl中的字符串生成子字符串

,我已經使用編輯

代碼:

my @arr = split('\s', $line); 
for(my $i=0; $i<$#arr; $i++) 
{ 
my $str1 = $arr[$i]; 
my $str2 = $arr[$i].' '.$arr[$i+1]; 
my $str3 = $arr[$i].' '.$arr[$i+1].' '.$arr[$i+2]; 
my $str4 = $arr[$i].' '.$arr[$i+1].' '.$arr[$i+2].' '.$arr[$i+3]; 
} 

我有很長的字符串,通過這種方法需要很多時間。
在此先感謝

+0

爲什麼你認爲正則表達式會有所幫助? – tripleee

回答

0

您可以創建一個內循環以避免重複的代碼。而且,用點運算符重複粘貼東西效率較低。

my @substrings; 
for (my $i=0; $i<=$#arr; ++$i) 
{ 
    for (my $j=0; $j<5 && $i+$j<=$#arr; ++$j) 
    { 
     push @substrings, join(' ', @arr[$i..$i+$j]); 
    } 
} 

你會發現額外的邊界條件,以防止內環從去過去的輸入數組的結尾,並採用了全新的陣列@substrings的遏制效果。最後,看看縮進如何幫助你看到什麼地方。

+0

SpamAssassin中的TextCat模塊的功能類似。他們使用'substr'來提取子字符串,而不是將多個東西連接在一起,這可能更有效。而且,出於性能方面的考慮,它們會刪除*內部循環,從而產生更像您的代碼。 – tripleee

+0

你的回答會進一步增加時間複雜度,我希望在時間方面更好。 – Rajinder

+0

你顯示的代碼有兩個錯誤,我已經糾正了,還有一個效率問題,我已經糾正了(當然還有縮進,我也解決了這個問題)。如果您僅從我的答案中獲得修正和更正,它會變慢嗎?無論如何,也許你應該用固定的代碼更新你的問題,所以我們不必討論這些錯誤修正(做對了,*然後*讓它快)。我沒有執行時間,但也許你應該 - 多少費用通過'加入',也許對'substr'建議,但沒有顯示? – tripleee