Depending on where you look, you'll get slightly different answers.
Functional Testing :
Testing the features and operational behavior of a product to ensure that the application is developed correspond to its specifications and requirements.
Testing that ignores the internal mechanism of a system or component and focuses solely on the outputs generated in response to selected inputs and execution conditions.
Functional tests check a particular feature for correctness by comparing the results for a given input against the specification. Functional tests don't concern themselves with intermediate results or side-effects, just the result (they don't care that after doing x, object y has state z). They are written to test part of the specification such as, "calling function Square(x) with the argument of 2 returns 4".
Regression Testing:
"A regression test re-runs previous tests against the changed software to ensure that the changes made in the current software do not affect the functionality of the existing software."
Regression is surely a check against the newly deployed code/or a release deployment happened where we just make sure it has no other impacts (ex: in terms of code, functionalities, output and the behavior of the application) and therefore we ensure that deployment has been smooth.