Обратите внимание, что .*_[^f|b|i]
с matches()
не означает совпадение , если не заканчивается , это означает совпадение , если оно заканчивается символом, отличным от того, который (-ы) определен в набор символов . Однако в этом случае, похоже, нет никакой разницы. Единственная проблема заключается в том, что |
рассматривается как символ канала в классе символов, а dt
будет рассматриваться как 2 отдельных символа, если вы поместите его в класс символов.
У вас есть как минимум 2 параметра (может быть и больше): используйте регулярное выражение, соответствующее любой строке, которая не заканчивается на _
, за которой следуют b
, i
, f
или dt
или сопоставьте эти буквы / комбинации букв с подчеркиванием в конце строки и отмените результат.
Подход 1 :
List<String> strs = Arrays.asList("aaaa_b", "zzzzzz_i", "---------_f", "TTTTT_dt", "..._.");
for (String str : strs)
System.out.println("\"" + str + "\": " + str.matches(".*(?<!_[bif]|_dt)"));
Выход:
"aaaa_b": false
"zzzzzz_i": false
"---------_f": false
"TTTTT_dt": false
"..._.": true
ПРИМЕЧАНИЕ : Чтобы сделать его нечувствительным к регистру, вы можете добавить к шаблону (?i)
, "(?i).*(?<!_[bif]|_dt)"
. Кроме того, .
не соответствует разрывам строк по умолчанию, вы можете позволить ему соответствовать им с (?s)
, "(?si).*(?<!_[bif]|_dt)"
.
Подход 2 :
List<String> strs = Arrays.asList("aaaa_b", "zzzzzz_i", "---------_f", "TTTTT_dt", "..._.");
Pattern p = Pattern.compile("_(?:[bif]|dt)\\z");
for (String str : strs) {
System.out.println("\"" + str + "\": " + !p.matcher(str).find());
}
Вывод такой же. Применяется то же примечание о нечувствительности к регистру.