2015-04-24 2 views
0

Я написал это регулярное выражение, которое позволяет вам сопоставить имя таблицы. Проблема в том, что она также соответствует полям таблицы (AAA_BBB_CCC_DDD).regex matcher в именах таблиц

Я бы хотел, чтобы он не соответствовал таблицам полей, которые после SELECT.

(^|,?\s*)([A-Z]+(_[A-Z]+){2,})(,?\s*|$) 

спасибо.

+0

Пожалуйста, пост несколько примеров того, что вы хотите, чтобы соответствовать и то, что вы не хотите, чтобы соответствовать ,. – npinti

+0

Например: AAA_BBB_CCC_DDD => СПИЧКА AAA_BBB_CCC_DDD, AAA_BBB_CCC_DDD => СПИЧКА AAA_BBB_CCC_DDD alias1, AAA_BBB_CCC_DDD ALIAS2, => СПИЧКА (SELECT FIELD_NAME_EXAMPLE, MAX (ID) AS TOTO ОТ AAA_BBB_CCC_DDD GROUP BY FIELD_YEAR_EXAMPLE => ПРЕДУПРЕЖДЕНИЕ . матч с FIELD_NAME_EXAMPLE и FIELD_YEAR_EXAMPLE Я не хочу – jeyGey

+0

Просьба предоставить больше контекста Фактические данные помогли бы, а – npinti

ответ

0
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); 
} 

Это возвращает меня следующие имена таблиц:

ODS_HIST_PS_AF_C_APPTMNT => OK

F_CONTRACT_ID => NO (FIELD)

F_CONTRACT_ID => NO (FIELD)

ODS_HIST_PS_AF_C_APPTMNT => ОК

Regex:

"(^|,?\s*)(?<!(SELECT\s+|BY\s+))([A-Z]+(_[A-Z]+){2,})(,?\s*|$)" 

Я нахожу это: Regex lookahead, lookbehind and atomic groups

+0

Работает. "\ b (? jeyGey

Смежные вопросы