Отрицательный взгляд назад: как я могу остановить совпадения, когда суффикс повторяется? - PullRequest
2 голосов
/ 30 июня 2019

У меня есть некоторые suffix, которые я хочу сопоставить, когда некоторые prefix отсутствуют. Однако suffix может повторяться.

Некоторые примеры:

 1. prefixsuffix - should not match
 2. prefixsuffixsuffix - should not match
 3. prefixsuffixsuffixsuffix - should not match
 4. suffix - should match
 5. suffixsuffix - should match
 6. suffixsuffixsuffix - should match

Я пробовал это регулярное выражение: (?<!prefix)suffix, что не удается в примерах 2, 3, поскольку более поздние suffix совпадают.

Итак, я попробовал это регулярное выражение: (?<!prefix)(suffix)*, надеясь, что это позволит повторить suffix, но, похоже, проблема та же.

Итак, я хочу регулярное выражение, удовлетворяющее приведенным выше примерам.

Ответы [ 3 ]

1 голос
/ 30 июня 2019

Вы можете просто добавить утверждение границы слова перед вашим взглядом, чтобы убедиться, что вы соответствуете, начиная с символа слова:

\b(?<!prefix)(?:suffix)+

RegEx Demo

Однако, глядя на ваши данные, даже \b(?:suffix)+ также может работать для вас.

1 голос
/ 30 июня 2019

В вашем отрицательном взгляде чередуйтесь с suffix, а при сопоставлении suffix для реального используйте + вместо * (поскольку * может соответствовать нулю вхождений, что не желательно):

(?<!prefix|suffix)(suffix)+

https://regex101.com/r/pEoYRA/1

0 голосов
/ 30 июня 2019

Я предполагаю, что, возможно, мы могли бы начать с этого выражения,

^(?=(?!prefix)(suffix))\1+$

Демо

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "^(?=(?!prefix)(suffix))\\1+$";
final String string = "prefixsuffix\n"
     + "prefixsuffixsuffix\n"
     + "prefixsuffixsuffixsuffix\n\n"
     + "suffix\n"
     + "suffixsuffix\n"
     + "suffixsuffixsuffix";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}
...