Обратное сопоставление регулярных выражений с определенной строкой?

Я хотел бы сопоставить следующие

  • com.my.company. moduleA .MyClassName
  • com.my.company. moduleB .MyClassName
  • com.my.company. somethingElse .MyClassName

но не следующие

  • com.my.company. core .MyClassName

Мой текущий простой шаблон регулярного выражения:

Pattern PATTERN_MODULE_NAME = Pattern.compile("com\\.my\\.company\\.(.*?)\\..*")

Matcher matcher = PATTERN_MODULE_NAME.matcher(className);
if (matcher.matches()) {
    // will return the string inside the parentheses (.*?)
    return matcher.group(1);
}

Итак, в основном, как я могу сопоставить все остальное, но не конкретную строку, которая в моем случае является строкой core.

Поделитесь, пожалуйста, своими идеями о том, как этого добиться на Java?

Спасибо !


person Albert Gan    schedule 07.06.2011    source источник


Ответы (2)


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

^com\\.my\\.company\\.(?!core).+?\\.MyClassName$
person codaddict    schedule 07.06.2011
comment
+1, но похоже, что у вас есть дополнительная точка прямо перед последней парой обратной косой черты. - person Alan Moore; 07.06.2011
comment
codaddict: Спасибо! Это именно то, что я искал. - person Albert Gan; 08.06.2011

Возможно, регулярное выражение - не самый ясный способ написать это.

if (className.startsWith("com.my.company.") 
    && !className.startsWith("com.my.company.core.")) {

}

Это совершенно ясно, что он делает, и вы можете обнаружить, что это быстрее. ;)

person Peter Lawrey    schedule 07.06.2011
comment
Спасибо, все просто и чисто. :-) - person Albert Gan; 08.06.2011
comment
Регулярные выражения - это круто, но они могут превратиться в загадочную строку символов, из-за чего кому-то, прочитавшему его позже, будет сложно определить, что именно оно делает или как это изменить. - person Peter Lawrey; 08.06.2011