Проблема сопоставления регулярных выражений в Perl - PullRequest
2 голосов
/ 26 сентября 2011

Я думаю, что мне здесь не хватает чего-то простого ...

$key = "deco-1-LB-700F:MAR:40";
  if ($key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)/) {
      print "1=$1 2=$2 3=$3 4=$4 5=$5";
  }

В результате получается: 1 = 1 2 = LB 3 = 700F 4 = MAR 5 =

Почему $ 5 не возвращает значение 40?

Приветствия, Stu

Ответы [ 2 ]

6 голосов
/ 26 сентября 2011

Потому что .*? ленив и будет соответствовать нулю символов, если это возможно. Прикрепите регулярное выражение к концу строки:

$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/

Но почти всегда лучше использовать что-то более явное, чем универсальные .* и .*?. Скажите движку регулярных выражений именно то, что вы хотите, чтобы соответствовать. Предполагая, что разделители - и : никогда не встречаются в реальных совпадениях, я предлагаю

$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/
  • [^-] означает «соответствовать любому символу, кроме -».
  • [^:] означает «соответствовать любому символу, кроме :».
2 голосов
/ 26 сентября 2011
split qr/[:-]/, 'deco-1-LB-700F:MAR:40'

возвращает

(
    'deco',
    1,
    'LB',
    '700F',
    'MAR',
    40,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...