我尝试了一些方法来匹配一个包含3次斜线但却无法工作的单词。以下是示例
@array = qw( abc/ab1/abc/abc a2/b1/c3/d4/ee w/5/a s/t )
foreach my $string (@array){
if ( $string =~ /^\/{3}/ ){
print " yes, word with 3 / found !\n";
print "$string\n";
}
else {
print " no word contain 3 / found\n";
}
我尝试过很少的macthing,但没有一个工作
$string =~ /^\/{3}/;
$string =~ /^(\w+\/\w+\/\w+\/\w+)/;
$string =~ /^(.*\/.*\/.*\/.*)/;
我可以匹配这种类型的字符串并打印字符串吗?
答案 0 :(得分:9)
全局匹配并将匹配数与handler
3
其中()=
operator是上下文的播放,强制列表上下文在其右侧,但在其左侧提供标量上下文时返回该列表的元素数。
如果您对这样的语法拉伸分配给数组感到不舒服
if ( ( () = m{/}g ) == 3 ) { say "Matched 3 times" }
后续比较在标量上下文中对其进行评估。
您正在尝试匹配三个连续 if ( ( my @m = m{/}g ) == 3 ) { say "Matched 3 times" }
,而您的字符串没有。
答案 1 :(得分:3)
您需要的模式(添加空格)是
^ [^/]* / [^/]* / [^/]* / [^/]* \z
或
^ [^/]* (?: / [^/]* ){3} \z
您的第二次尝试已经结束,但是使用^
而没有\z
这样做了,所以您检查了字符串以开头。
解决方案:
say for grep { m{^ [^/]* (?: / [^/]* ){3} \z}x } @array;
或
say for grep { ( () = m{/}g ) == 3 } @array;
或
say for grep { tr{/}{} == 3 } @array;
答案 2 :(得分:1)
你需要匹配
In [363]: np.loadtxt(L, delimiter=',',dtype='datetime64[D]',usecols=0)
Out[363]: array(['2017-07-26', '2017-07-25', '2017-07-24'], dtype='datetime64[D]')
)^(?:[^\/]*
答案 3 :(得分:0)
if ( $string =~ /\/.*\/.*\// and $string !~ /\/.*\/.*\/.*\// )