作者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://www.ptt.cc/bbs/Perl/M.1588165919.A.732.html
推 luncha: 感謝flu大,先消化一下!看來有很多細節要考慮 04/29 23:08
推 luncha: 兩個方法讓我學到lookbehind, join+foreach運用~感謝! 04/30 10:14
推 herculus6502: 推 05/01 19:44