Po przemyśleniu.. tak się nie da - tzn. pewnie można by zrobić takie wyrażenie, ale zwykłe wstawienie (?<!.pdf) spowoduje, że zamiast "www.adres.pl/katalog/plik.pdf" złapie "www.adres.pl/katalog/plik.pdf".
Sugeruję łapać wszystko, ale dodać parametr 'e' i sprawdzać w php czy nie ma ".pdf" na końcu.
Dodatkowo podrzucę Ci swój RegExp od URL, który ostatnio dość nieźle dopracowałem, ale jak chcesz, to sobie zmień na swój.
Wygląda to tak:
<?
$a = 'http://a.pl/c.txt
http://a.pl/c.pdf
https://a.pl/c.txt
https://a.pl/c.pdf
www.a.pl/c.txt
www.a.pl/c.pdf';
//złamałem wyrażenie na 2 linie by strony nie rozwalało - ale to musi być w jednej linii
$regexp = '@\b(?:(?:(?:news://|nntp://|telnet://|irc://|mms://|ed2k://|file://|about:|mailto:|xmpp:|https?://|ftp://)
(?:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|[^{}<>^|\'"`.\s]+\.?)+)|\b(?:www|ftp)\.(?:[^{}<>^|\'"`.\s]+\.?)+)(?:[/=#]|\b)@ie';
echo '<pre>' . preg_replace ($regexp, 'substr("\0",-4)==".pdf"?"\0":"[url]\0[/url]"', $a);
?>
Wynik:
[url]http://a.pl/c.txt[/url]
http://a.pl/c.pdf
[url]https://a.pl/c.txt[/url]
https://a.pl/c.pdf
[url]www.a.pl/c.txt[/url]
www.a.pl/c.pdf
Oczywiście [url] sobie zamień na - to tylko dla przykładu.
Kod nie obsługuje parametrów za .pdf, czyli linków typu "www.a.pl/plik.pdf?cos=123" ale to chyba nie szkodzi, bo wątpię, że takie masz.