Как сопоставить строку, содержащую точное трехкратное вхождение специального символа в perl - PullRequest
0 голосов
/ 25 мая 2018

Я пробовал несколько методов, чтобы соответствовать слову, которое содержит точную косую черту 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 ]

0 голосов
/ 01 июня 2018
if ( $string =~ /\/.*\/.*\// and $string !~ /\/.*\/.*\/.*\// )
0 голосов
/ 25 мая 2018

Вам необходимо сопоставить

  • косую черту
  • в окружении некоторых не косых черт (^(?:[^\/]*)
  • , повторяя совпадение ровно три раза
  • и включает всю тройку в начале строки и якорей строки:
$string =~ /^(?:[^\/]*\/[^\/]*){3}$/;
0 голосов
/ 25 мая 2018

Нужный вам шаблон (с добавленным пробелом):

^ [^/]* / [^/]* / [^/]* / [^/]* \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;
0 голосов
/ 25 мая 2018

Совпадение глобально и сравнение количества совпадений с 3

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

, где оператор ()= является воспроизведением контекста, форсируя контекст списка справа, новозвращает количество элементов этого списка, когда скалярный контекст предоставлен на левой стороне.

Если вас не устраивает такое растяжение синтаксиса, присваивайте массиву

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

, где последующее сравнение оценивает его в скалярном контексте.

Вы пытаетесь сопоставитьтри подряд / и в вашей строке этого нет.

...