Вот полностью регулярное выражение основано решение:
public static void main(String[] args) throws Exception {
final String in = "My db objects are db.main_flow_tbl, 'main_flow_audit_tbl', main_request_seq and MAIN_SUBFLOW_TBL.";
final Pattern pat = Pattern.compile("main_(?!\\w*?(?:audit|seq))\\w++", Pattern.CASE_INSENSITIVE);
final Matcher m = pat.matcher(in);
while(m.find()) {
System.out.println(m.group());
}
}
Выход:
main_flow_tbl
MAIN_SUBFLOW_TBL
Это предполагает, что имена таблиц могут содержать только A-Za-Z_
который \w
является сокращением для.
пробой шаблона:
main_
является liternal «основным», что вы хотите таблицы, чтобы начать с
(?!\\w*?(?:audit|seq))
является отрицательным опережением (не следует), который принимает любое количество \w
символов (лениво) за которым следует либо «аудит», либо «seq». Это исключает имена таблиц, которые содержат эти последовательности.
\\w++
потребляют любые символы таблицы.
РЕДАКТИРОВАТЬ
комментарий OP в они могут содержать цифры, а
В этом случае использование этой схеме:
main_(?![\\d\\w]*?(?:audit|seq))[\\d\\w]++
т.е. использовать [\\d\\w]
, а не \\w
Возможно это ссылки могут помочь http://stackoverflow.com/questions/4813497/java-regex-case-insensitivity- нерабочий и http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word – holap
Что вы пытались до сих пор? Нужно ли использовать регулярное выражение? – jwueller