作者flu (Crazy Rhythm)
看板Perl
标题Re: [请益] 字串中连续逗号以空格隔开
时间Wed Apr 29 21:11:57 2020
use strict;
use warnings;
use feature qw/say/ ;
#方式1
my $str = "INIT, ,, ," ;
$str =~ s/\s+//g ;
#以下使用到的 (?<=) 是 lookbehind assertion
# 解释起来意思是当看到","时,如果它之前也有","
# 那才匹配成功,
#而且取代时(?<=)里的东西不会被取代,因为匹配到
# 的是(?<=)後的东西。再来是它像/^/, /$/ 一样
# 不占字元宽度,所以下次比对的开始位置只离一个
# 字元而已。如果用 /,,/ 比对,就会离两个字元
say $str =~ s/(?<=,),/ $_/gr foreach qw/= ,/ ;
#方式2
my $str2 = "INIT,1,2,3,4" ;
for my $_s ($str, $str2){
say '-' x 30 ;
#关於split的第三个参数造成的差异
# 原po的例子刚好与perldoc里举的例子相似
my @tokens = split /,/, $_s, -1 ;
say join $_ , @tokens foreach ("= ", ", ") ;
}
__END__
#输出
INIT, = = =
INIT, , , ,
------------------------------
INIT= = = =
INIT, , , ,
------------------------------
INIT= 1= 2= 3= 4
INIT, 1, 2, 3, 4
※ 引述《luncha (谢谢)》之铭言:
: 各位先进
: 目前在使用perl的字串处理
: 但是无法有效分开字符,想请大家解惑
: 想要把字串中”连续逗号”用空格隔开
: 如下:
: $str1=‘judge(“pat, pat1, pat2”, INIT,,,,,,,,,,,)‘;
: $str2=‘judge(“pa3, pat4, pat5”, INIT, ,, ,,,, ,,,,)‘;
: $str1 =~ s/\,\,/, ,/g ;
: $str2 =~ s/\,\,/, ,/g
: 结果:
: judge(“pat, pat1, pat2 “, INIT, ,, ,, ,, ,, ,,);
: judge(“pa3, pat4, pat5 “, INIT, , , , ,, , , ,, ,);
: 但是我想要的格式是:
: judge(“pat, pat1, pat2”, INIT, , , , , , , , , , ,);
: judge(“pa3, pat4, pat5 “, INIT, , , , , , , , , , ,);
: 请问该怎麽修改呢?
: 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.26.206.89 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1588165919.A.732.html
1F:推 luncha: 感谢flu大,先消化一下!看来有很多细节要考虑 04/29 23:08
2F:推 luncha: 两个方法让我学到lookbehind, join+foreach运用~感谢! 04/30 10:14
3F:推 herculus6502: 推 05/01 19:44