You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按多字符分割字符串且保留分隔符,同时不按空格分割?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 08:50:22