3

我尝试了几种方法来匹配包含精确 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";
    }

我尝试了很少的东西,但它们都不起作用

$string =~ /^\/{3}/;
$string =~ /^(\w+\/\w+\/\w+\/\w+)/;
$string =~ /^(.*\/.*\/.*\/.*)/;

还有其他方法可以匹配这种类型的字符串并打印字符串吗?

4

4 回答 4

8

全局匹配 a/并将匹配数与3

if ( ( () = m{/}g ) == 3 ) { say "Matched 3 times" }

其中=()=运算符是上下文的游戏,强制列表上下文在其右侧,但在其左侧提供标量上下文时返回该列表的元素数。

如果您对这样的语法延伸感到不舒服,那么分配给一个数组

if ( ( my @m = m{/}g ) == 3 ) { say "Matched 3 times" }

随后的比较在标量上下文中对其进行评估。

您正在尝试匹配三个连续 /的并且您的字符串没有。

于 2018-05-25T06:43:44.420 回答
3

The pattern you need (with whitespace added) is

^ [^/]* / [^/]* / [^/]* / [^/]* \z

or

^ [^/]* (?: / [^/]* ){3} \z

Your second attempt was close, but using ^ without \z made it so you checked for string starting with your pattern.


Solutions:

say for grep { m{^ [^/]* (?: / [^/]* ){3} \z}x } @array;

or

say for grep { ( () = m{/}g ) == 3 } @array;

or

say for grep { tr{/}{} == 3 } @array;
于 2018-05-25T07:04:09.360 回答
1

你需要匹配

  • 斜线
  • 被一些非斜线 ( ^(?:[^\/]*)包围
  • 准确地重复比赛三遍
  • 并将整个三元组包含在行首和行锚的开头:
$string =~ /^(?:[^\/]*\/[^\/]*){3}$/;
于 2018-05-25T06:43:47.310 回答
-1
if ( $string =~ /\/.*\/.*\// and $string !~ /\/.*\/.*\/.*\// )
于 2018-06-01T15:18:52.357 回答