$re = '/(PostgreSQL (?P<psql_major>\d{1,2})\.(?P<psql_minor>\d{1,2})(?P<psql_opt_patch>\.\d{1,2})?, )?Aurora PostgreSQL release (?P<aurora_psql_major>\d{1,2})\.(?P<aurora_psql_minor>\d{1,2})(?P<aurora_psql_opt_patch>\.\d{1,2})?(?P<release_or_deprecation>\,\s(?P<release_data>.*)|\s\(Deprecated on (?P<deprecation_date>.*)\))?/m';
$str = 'PostgreSQL 12.6, Aurora PostgreSQL release 4.1 (Deprecated on July 15, 2022)
PostgreSQL 12.4, Aurora PostgreSQL release 4.0 (Deprecated on July 15, 2022)
Aurora PostgreSQL release 14.3.1, July 6, 2022
PostgreSQL 9.6.8, Aurora PostgreSQL release 1.2 (Deprecated on October 28, 2021)
PostgreSQL 9.6.8, Aurora PostgreSQL release 1.2.4
PostgreSQL 14.5, Aurora PostgreSQL release 1.2
Aurora PostgreSQL release 14.3.1, Deprecated on October 28, 2021)';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php