![](/img/trans.png)
[英]how can we filter elements in array with regex in array with javascript?
[英]How to filter each array elements according to a regex
我有一個像這樣的元素數組:
@ORF= (MEZQFVECQWSXC*FVCXRCT*, MAEZCRTDRX*AZEFZC*AZERC*)
我想分割每個數組,使每個元素以'M'
開頭,以'*'
結尾,中間沒有多余的'*'
。
所以我上面的例子應該給我
@ORF = (MEZQFVECQWSXC*,MAEZCRTDRX*)
我考慮過首先像這樣拆分每個元素:
foreach (@ORF) {
my $true= split /\*/, $_;
push @ORF, $true
}
然后使用if語句將其他拼接起來,但這是行不通的。
我也考慮過使用grep
@ORF= grep m/M.*\*/, @ORF;
但這不會影響數組。
我越來越困惑,谷歌沒有幫助...請幫幫我嗎?
您確實可以通過split
和loop做到這一點。 您也可以使用map
代替for
循環。
use strict;
use warnings;
use Data::Printer;
my @ORF= ('MEZQFVECQWSXC*FVCXRCT*', 'MAEZCRTDRX*AZEFZC*AZERC*');
@ORF = map { (split /\*/, $_, 0 )[0] . '*' } @ORF;
p @ORF;
它將遍歷@ORF
每個元素,並在*
上split
。 第三參數0
表示split
僅拆分一次。 將返回值視為一個列表,並且只使用第一個元素( [0]
),放回星號,您將獲得一個新的字符串列表,這些字符串以M
開頭並以星號結束。
[
[0] "MEZQFVECQWSXC*",
[1] "MAEZCRTDRX*"
]
當然,假設只有字符串匹配此模式而無需檢查。
一種簡單的方法是使用substr
和index
查找*
的第一個出現位置,並以字符串的開頭直到該字符為止。 那可能更像是您想對splice
,但是誤解了該操作。
@ORF = map { substr $_, 0 , index($_, '*') + 1 } @ORF;
foreach (@ORF) { my $true= split /\\*/, $_; push @ORF, $true }
這實際上非常接近解決方案。 只有幾個問題。
首先,您要將返回值從split
給標量變量。 在標量上下文中, split
返回它可以將字符串拆分為的項目數,而不是項目本身。 因此,您將只獲得值2。我們可以通過將其指定為列表分配來解決此問題。
my ($true) = split /\*/, $_;
其次,將新值push
到@ORF
。 這意味着@ORF
只會越來越長,循環永遠不會結束。 您需要用新值替換數組的當前元素。 您可以通過分配$_
。
因此,整個循環變為:
foreach (@ORF) {
my ($true) = split /\*/, $_;
$_ = "$true*";
}
如果願意,還可以使用map + grep,如下所示:
use Data::Dumper;
my @ORF= ("MEZQFVECQWSXC*FVCXRCT*", "MAEZCRTDRX*AZEFZC*AZERC*");
@ORF = grep { $_ =~ /^M/ } map { (split/\*/, $_)[0] . '*' } @ORF;
print Data::Dumper->Dump(\@ORF);
結果:
$VAR1 = 'MEZQFVECQWSXC*';
$VAR2 = 'MAEZCRTDRX*';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.