string request = "ODS_HIST_PS_AF_C_APPTMNT ,(SELECT AF_CONTRACT_ID,MAX(EFFDT) AS EFFDT FROM ODS_HIST_PS_AF_C_APPTMNT GROUP BY AF_CONTRACT_ID ) REQ_MAX";
string pattern = @"(^|,?\s*)(?<!(SELECT\s+|BY\s+))([A-Z]+(_[A-Z]+){2,})(,?\s*|$)";
foreach (Match match in Regex.Matches(request, pattern))
{
s.Add(match.Value);
}
This returns me the following table names :
ODS_HIST_PS_AF_C_APPTMNT => OK
F_CONTRACT_ID => NO (FIELD)
F_CONTRACT_ID, => NO (FIELD)
ODS_HIST_PS_AF_C_APPTMNT => OK
Regex :
"(^|,?\s*)(?<!(SELECT\s+|BY\s+))([A-Z]+(_[A-Z]+){2,})(,?\s*|$)"
I find this : Regex lookahead, lookbehind and atomic groups