Vous ne pouvez pas faire cela dans regexp seul car regexp ne prend pas en charge les mathématiques sur les groupes capturés même s'ils sont tous des caractères numériques. Vous devez donc obtenir le groupe qui représente le numéro d'étage, faire le calcul et le recoller :
SELECT regexp_replace('B12F34', 'B(\d+)F(\d+)', 'Building \1 - Floor ') ||
((regexp_matches('B12F34', '[0-9]+$'))[1]::int + 10)::text;
Pas très efficace à cause des deux appels d'expression régulière. Une autre option consiste simplement à obtenir les deux nombres dans une sous-requête et à assembler la chaîne dans la requête principale :
SELECT format('Building %L - Floor %L', m.num[1], (m.num[2])::int + 10)
FROM (
SELECT regexp_matches('B12F34', '[0-9]+', 'g') AS num) m;