How to match string that contain exact 3 time occurrence of special character in perl

最后都变了- 提交于 2019-12-01 22:18:30

Match globally and compare the number of matches with 3

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

where the ()= operator is a play on context, forcing list context on its right side but returning the number of elements of that list when scalar context is provided on its left side.

If you are uncomfortable with such a syntax stretch assign to an array

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

where the subsequent comparison evaluates it in the scalar context.

You are trying to match three consecutive / and your string doesn't have that.

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;

You need to match

  • a slash
  • surrounded by some non-slashes (^(?:[^\/]*)
  • repeating the match exactly three times
  • and enclosing the whole triple in start of line and and of line anchors:
$string =~ /^(?:[^\/]*\/[^\/]*){3}$/;
if ( $string =~ /\/.*\/.*\// and $string !~ /\/.*\/.*\/.*\// )
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!