如何在perl中匹配包含特殊字符的精确3次出现的字符串

时间:2018-05-25 06:37:09

标签: regex perl metacharacters

我尝试了一些方法来匹配一个包含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 =~ /^(.*\/.*\/.*\/.*)/;

我可以匹配这种类型的字符串并打印字符串吗?

4 个答案:

答案 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 !~ /\/.*\/.*\/.*\// )