2015-11-20 94 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