Regexp, чтобы соответствовать всей строке, НЕ заканчивающейся СПИСКОМ известных суффиксов (не символов, а слов) - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно иметь возможность построить регулярное выражение, охватывающее все возможные шаблоны, кроме строк, заканчивающихся на b или i или f или dt.

Моя строка всегда начинается со слов и имеет подчеркивание перед закрывающим суффиксом.
Если бы в черном списке суффиксов не было dt, я бы, вероятно, сделал что-то вроде следующего: \w+_[^f|b|i]+ OR maybe (.*)_[^f|b|i]

Но формат [^x|y|z] захватывает только отдельные символы, и я не смог объединить его с последовательностью символов.

Буду признателен за любую помощь,

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Если то, что вы хотите сопоставить, всегда начинается с символов слова и содержит подчеркивание перед закрывающим суффиксом, вы можете сопоставить один или несколько символов слова \w+, сопоставить подчеркивание и затем сопоставить одно или несколько символов слова \w+

Затем используйте отрицательный вид сзади, чтобы утверждать, что то, что находится слева, не является b, f, i или dt и заканчивается границей слова \b, чтобы убедиться, что суффиксне является частью большого слова.

\w+_\w+(?<![bfi]|dt)\b

Подробности

  • \w+_\w+ Соответствует одному илибольше символов слова, _ и снова один или несколько символов слова
  • (?<! отрицательный внешний вид
  • ) Закрыть отрицательный вид сзади
  • \b Граница слова

Демонстрация Java

0 голосов
/ 10 мая 2018

Обратите внимание, что .*_[^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());
}

Вывод такой же. Применяется то же примечание о нечувствительности к регистру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...