如何按多字符分割字符串且保留分隔符,同时不按空格分割?
解决Perl字符串按+-分组(不按空格拆分)的问题
你的问题出在split(/([+-]\S+)/)的逻辑上:\S+只会匹配到第一个空格就终止,split会将**分隔符(括号内的正则匹配部分)**和它前后的所有内容都拆分成数组元素,自然就出现了空字符串、纯空格这些不想要的结果。
更优雅的解决方案:直接全局匹配目标块
与其拆分字符串,不如直接提取你需要的分组——匹配以+或-开头,直到下一个+/-或字符串结尾的所有内容(包含中间空格):
#!/usr/bin/env perl use strict; my $line = "-abc=123 +def=456 -ghi 789"; # 全局匹配符合要求的块 my @arr = $line =~ /([+-].*?)(?=[+-]|$)/g; foreach my $elem (@arr) { $elem =~ s/\s+$//; # 可选:去除末尾空格 print "<${elem}>\n"; }
正则说明:
([+-].*?):捕获以+或-开头的内容,.*?是非贪婪匹配,避免一次性匹配到字符串结尾(?=[+-]|$):正向预查,确保匹配到下一个+/-或者字符串结束时停止,刚好分割出每个独立的块
运行结果:
<-abc=123> <+def=456> <-ghi 789>
若坚持用split的优化方案(不推荐)
如果一定要基于split修改,可以过滤空元素后合并相邻的分隔符和后续内容:
#!/usr/bin/env perl use strict; my $line = "-abc=123 +def=456 -ghi 789"; my @arr = grep { $_ !~ /^\s*$/ } split(/([+-]\S+)/,$line); my @result; while (@arr) { my $part = shift @arr . shift @arr; $part =~ s/\s+$//; push @result, $part; } foreach my $elem (@result) { print "<${elem}>\n"; }
内容的提问来源于stack exchange,提问作者daveg
相关产品推荐
相关产品推荐

