Может кто-нибудь, пожалуйста, объясните мне следующее выражениеМожет кто-нибудь объяснить мне это регулярное выражение
$input =~ m/\G".*?"(,|$)/gc || $input =~ m/\G[^,]*(,|$)/gc || die;
Может кто-нибудь, пожалуйста, объясните мне следующее выражениеМожет кто-нибудь объяснить мне это регулярное выражение
$input =~ m/\G".*?"(,|$)/gc || $input =~ m/\G[^,]*(,|$)/gc || die;
Есть два регулярных выражений здесь. Первый:
\G # the end of the previous match
".*?" # something in quotes
(,|$) # and a comma, or the end of the string
второй будет соответствовать, если первый терпит неудачу:
\G # the end of the previous match
[^,]* # anything up to the next comma or end of string
(,|$) # and then a comma, or the end of the string
Моя догадка двух регулярных выражений разработаны, чтобы соответствовать то, что может быть либо цитируемый или не котируется, и после запятой может последовать еще несколько предметов.
(Модификатор c
означает сохранить текущую позицию, если согласование не удается, поэтому \G
якорь не изменится во второй попытке, чтобы соответствовать, если первый терпит неудачу. Модификатор g
устанавливает позицию для \G
для следующего матч - между прочим.)
Первый означает соответствие каждой строке (это /gc
) между кавычками, за которыми следует запятая или конец строки. Второй означает соответствие любой последовательности из нуля или более (это *
) символов без запятой (это [^,]
). Обратите внимание, что модификатор \G
означает, что каждое новое совпадение должно начинаться сразу после предыдущего совпадения.
Какой? Какой бит вы не понимаете? – Quentin