У меня есть два регулярных выражения. Я хочу удалить все совпадения второго, если они помещены внутри совпадений первого. В принципе, ничто не может сравниться с тем, что уже было согласовано. Пример:Удалить совпадение регулярных выражений, помещенных внутри других регулярных выражений
Первое регулярное выражение (жирный) - c\w+
находит слова, начинающиеся с c
Второе регулярное выражение (подчеркнуты) - me
находит me
Результат: верблюд уход преступления прохладный дом среда расплава
me
в c-словах также сопоставляются. Хочу, чтобы я хотел: верблюд преступление уход прохладно medium melt home
Два результата второго регулярного выражения в результатах первого регулярного выражения, я хочу удалить их или просто не совпадать с ними вообще. Вот что я пробовал:
String text = "camel crime care cool medium melt home";
static final Pattern PATTERN_FIRST = Pattern.compile("c\w+");
static final Pattern PATTERN_SECOND = Pattern.compile("me");
// Save all matches
List<int[]> firstRegexMatches = new ArrayList<>();
for (Matcher m = PATTERN_FIRST.matcher(text); m.find();) {
firstRegexMatches.add(new int[]{m.start(), m.end()});
}
List<int[]> secondRegexMatches = new ArrayList<>();
for (Matcher m = PATTERN_SECOND.matcher(text); m.find();) {
secondRegexMatches.add(new int[]{m.start(), m.end()});
}
// Remove matches of second inside matches of first
for (int[] pos : firstRegexMatches) {
Iterables.removeIf(secondRegexMatches, p -> p[0] > pos[0] && p[1] < pos[1]);
}
В этом коде я хранить все матчи обоих в списке, попробуйте удалить из второго списка матчей помещается внутри первого списка совпадений.
Это не только не работает, но я не уверен, что он очень эффективен. Обратите внимание, что это упрощенная версия моей ситуации, которая содержит больше регулярных выражений и большой текст. Итераторы - из Гуавы.
Я не понимаю, что вы пытаетесь сделать. Вы пытаетесь удалить их из строки, так что результатом будет '' cal cri care cool medium melt home ''? Если это так, ваш вопрос неясно. Кроме того, я не вижу никакого кода, который фактически удаляет что-либо из строки. Кроме того, что такое 'Iterables'? Это не в стандартной библиотеке Java, так что это? Apache? Гуавы? Я не могу сказать, что происходит без этой информации, но похоже, что ваш 'removeIf' удаляет одну из пар из созданного вами' List'. Это ничего не удаляет из строки. – ajb
Кроме того, ваш первый шаблон находит любое «c», находится ли оно в начале слова или нет. – ajb
@ajb Все совпадения были сохранены в списке. Я пытаюсь удалить их из второго списка регулярных выражений. Iterables от Guava, я не мог использовать функцию java 8 –