<?php
function valid_ip($ip) {
        return preg_match("/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])" .
                          "(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/", $ip);
}
?>

<?php
preg_match("/(?P<foo>abc)(.*)(?P<bar>xyz)/",
           'abcdefghijklmnopqrstuvwxyz',
           $matches);
print_r($matches);
?>
------------------------------
Array
(
    [0] => abcdefghijklmnopqrstuvwxyz
    [foo] => abc
    [1] => abc
    [2] => defghijklmnopqrstuvw
    [bar] => xyz
    [3] => xyz
)

<?php
$pattern = '/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])' .
           '(([a-z0-9-])*([a-z0-9]))+' .
           '(\.([a-z0-9])([-a-z0-9_-])?([a-z0-9])+)+$/i';

echo preg_match ($pattern, "email-address-to-validate@host.tld");
?>

Группировать в регулярном выражении можно вложенно

<?php
$regexp = '@^/(tn(-crop)?)/(\d+)x(\d+)/(.+(jpg|png|gif))$@i';
foreach(array('/tn-crop/100x100/foo.jpg', '/tn/100x100/foo.jpg') as $v){
        echo $v.' - '.(preg_match($regexp, $v, $m) ? 'true' : 'false')."\n";
        print_r($m);
}
/tn-crop/100x100/foo.jpg - true
Array
(
    [0] => /tn-crop/100x100/foo.jpg
    [1] => tn-crop
    [2] => -crop
    [3] => 100
    [4] => 100
    [5] => foo.jpg
    [6] => jpg
)
/tn/100x100/foo.jpg - true
Array
(
    [0] => /tn/100x100/foo.jpg
    [1] => tn
    [2] => 
    [3] => 100
    [4] => 100
    [5] => foo.jpg
    [6] => jpg
)
-----------