While perfect Regex parsing of every possible MySQL query would be extraordinarily complex, something like this will work in a pretty substantial number of normal/basic use-cases:
(?:[\s](?:(?:CREATE|DROP) (?:TEMPORARY )?TABLE|EXISTS|FROM|JOIN|UPDATE|INTO)[\s]*)(?:`(?<fieldName>[a-z][-a-z_\d]*)`([\s]+AS[\s]+`?[a-z\d_-]+`?)?(?:,[\s]*)?)+/i
This returns matches for any words that start with a letter, and occur within back-tick quotes ( ` ) immediately after any instance of the terms EXISTS, FROM, JOIN, UPDATE and INTO as well as most common forms of CREATE TABLE and DROP TABLE. This clearly depends on using the optional INTO keyword on relevant queries (i.e. INSERT, REPLACE) and putting table references within back-ticks, but I don't think those are unreasonable requirements and doing both certainly helps minimise false positives.
So it should relatively-reliably catch table names from typical queries like these:
SELECT FROM `tableName`[, `tableName2`...] [AS...] [LEFT|RIGHT] JOIN `joinTable` [AS...]
INSERT INTO `tableName` [AS...]
DELETE FROM `tableName` [AS...]
UPDATE `tableName` [AS...] SET VALUES...
CREATE TABLE `tableName`[, `tableName2`...]
DROP TEMPORARY TABLE `tableName`
CREATE TABLE IF NOT EXISTS `tableName`[, `tableName2`...]
Obviously, being as this is a simple regex string parser, any time the parsed query actually contains a string which itself mimics any of the relevant formats of a query as data, would falsely be caught as well...