List<TextRange> (String text, TextRange range, @NotNull Pattern toExclude, int groupToInclude) { List<TextRange> toCheck = new SmartList<>(); int from = range.getStartOffset(); int till; boolean addLast = true; try { Matcher matcher = toExclude.matcher(newBombedCharSequence(text, range)); while (matcher.find()) { checkCancelled(); TextRange found = matcherRange(range, matcher); till = found.getStartOffset(); if (range.getEndOffset() - found.getEndOffset() < MIN_RANGE_LENGTH) { addLast = false; } if (!badSize(from, till)) { toCheck.add(new TextRange(from, till)); } if (groupToInclude > 0) { TextRange contentFound = matcherRange(range, matcher, groupToInclude); if (badSize(contentFound.getEndOffset(), contentFound.getStartOffset())) { toCheck.add(contentFound); } } from = found.getEndOffset(); } till = range.getEndOffset(); if (badSize(from, till)) { return toCheck; } if (addLast) { toCheck.add(new TextRange(from, till)); } return toCheck; } catch (ProcessCanceledException e) { return Collections.singletonList(range); } }