Opa Lucas, Tudo beleza ?
Então vou tentar te explicar por partes beleza ?
Destrinchando esse pattern temos :
^[0-9]{1,3} => Está primeira parte diz que o padrão tem que começar(^)com um numero de 0-9 ( [0-9] ) e possuir de no mínimo 1 e no máximo 3 caracteres ( {1,3} ).
([.][0-9]{3})* => deve começar com . ([.]), possuir somente números ([0-9]) e com 3 dígitos necessariamente (3) e pode ter qualquer quantidade deste pattern (*).
Exemplos : 1.123,12 => Uma "instancia" do pattern
12,12 ou 0,12 ou 0,00 => Nenhuma "instancia" do pattern
1.123.456,12 ou 123.123.456.789,12 => Mais de uma "instancia" do pattern
***Perceba que o subpaterrn está em parênteses ([.][0-9]{3})
Por fim : [,][0-9]{2}$ => [,] Começar com uma ,(,)possuir apenas números de 0 a 9 [0-9], e necessariamente 2 dígitos, além de terminar com um numero $.
Para saber mais sobre os metadados :
https://www.php.net/manual/en/regexp.reference.meta.php
Para ter mais exemplos e uma leitura em leitura bem simplificada e interessante :
https://www.devmedia.com.br/expressoes-regulares-em-php/25076
Abs,