2013-12-11 2 views
-1

У меня есть один вкладыш строку, которая выглядит следующим образом:Найти строку, которая не содержит подстроку

Мои объекты БД являются db.main_flow_tbl, «main_flow_audit_tbl», main_request_seq и MAIN_SUBFLOW_TBL.

Я хочу использовать регулярные выражения для возврата таблиц базы данных, которые начинаются с основным но не содержат словам проведения ревизии на или SEQ, и независимо от случая. Таким образом, в приведенном выше примере строки main_flow_tbl и MAIN_SUBFLOW_TBL должны быть возвращены. Может кто-нибудь помочь мне с этим, пожалуйста?

+0

Возможно это ссылки могут помочь http://stackoverflow.com/questions/4813497/java-regex-case-insensitivity- нерабочий и http://stackoverflow.com/questions/406230/regular-expression-to-match-string-not-containing-a-word – holap

+0

Что вы пытались до сих пор? Нужно ли использовать регулярное выражение? – jwueller

ответ

2

Вот полностью регулярное выражение основано решение:

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

+0

они также могут содержать цифры –

+0

Хорошее решение! Я все еще бросал на негативный взгляд –

+0

Спасибо. Это сработало! –

0
String str 
while ((str.startsWith("main"))&&!str.contains("audit")||!str.contains("seq")){ 
    //your code here 
} 
+0

Я попросил регулярные выражения –

+0

@YasserAlMasri: Это домашнее задание? Почему это должно быть регулярным выражением, если есть рабочая альтернатива? – jwueller

+0

, потому что в противном случае это будет очень утомительно. Что такое str в вашем случае?У меня нет ничего, чтобы захватить массив строк, которые действительно содержат таблицы. Это может быть что угодно, в строке –

0

Если строка соответствует

^main_(\w_)*(?!(?:audit|seq)) 

это должно быть то, что вы хотите ...

+0

Почти. У вас нет флага, нечувствительного к регистру. У вас есть стартовый якорь, поэтому он не найдет шаблоны _in_ 'String's; чего хочет OP. И ваша группа совпадений захватит _up до последовательности, которые OP не хочет. Поэтому вместо исключения имен, содержащих 'seq', как' table_seq', это будет захватывать 'table_'. Короче ** проверьте свой код перед публикацией **. –

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