Je kunt dit niet alleen in regexp doen, omdat regexp geen wiskunde ondersteunt voor vastgelegde groepen, zelfs als het allemaal numerieke tekens zijn. Dus je moet de groep krijgen die het verdiepingsnummer vertegenwoordigt, de wiskunde doen en het er weer in splitsen:
SELECT regexp_replace('B12F34', 'B(\d+)F(\d+)', 'Building \1 - Floor ') ||
((regexp_matches('B12F34', '[0-9]+$'))[1]::int + 10)::text;
Niet erg efficiënt vanwege de twee regexp-aanroepen. Een andere optie is om gewoon de twee getallen in een subquery te krijgen en de string in de hoofdquery samen te voegen:
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;