@@ -11,9 +11,12 @@ import java.util.regex.Pattern; | |||||
@NoArgsConstructor | @NoArgsConstructor | ||||
public class RegexReplacementFilter implements RegexStreamFilter { | public class RegexReplacementFilter implements RegexStreamFilter { | ||||
public static final String DEFAULT_PREFIX_REPLACEMENT_WITH_MATCH = "!"; | |||||
@Getter @Setter private Pattern pattern; | @Getter @Setter private Pattern pattern; | ||||
@Getter @Setter private int group; | @Getter @Setter private int group; | ||||
@Getter @Setter private String replacement; | @Getter @Setter private String replacement; | ||||
@Getter @Setter private String prefixReplacementWithMatch = DEFAULT_PREFIX_REPLACEMENT_WITH_MATCH; | |||||
public RegexReplacementFilter(String regex, int group, String replacement) { | public RegexReplacementFilter(String regex, int group, String replacement) { | ||||
this.pattern = Pattern.compile(regex); | this.pattern = Pattern.compile(regex); | ||||
@@ -45,8 +48,14 @@ public class RegexReplacementFilter implements RegexStreamFilter { | |||||
// add everything before the group match | // add everything before the group match | ||||
result.append(buffer.subSequence(matcher.start(), matcher.start(group))); | result.append(buffer.subSequence(matcher.start(), matcher.start(group))); | ||||
// add the replacement | |||||
result.append(replacement); | |||||
// if the replacement starts with the special prefixReplacementWithMatch, insert the match before the replacement | |||||
if (replacement.startsWith(prefixReplacementWithMatch)) { | |||||
result.append(buffer.subSequence(matcher.start(group), matcher.end(group))); | |||||
result.append(replacement.substring(prefixReplacementWithMatch.length())); | |||||
} else { | |||||
// add the replacement | |||||
result.append(replacement); | |||||
} | |||||
// add everything after the group match | // add everything after the group match | ||||
result.append(buffer.subSequence(matcher.end(group), matcher.end())); | result.append(buffer.subSequence(matcher.end(group), matcher.end())); | ||||
@@ -38,6 +38,18 @@ public class RegexFilterReaderTest { | |||||
assertEquals("multi reader failed to get expected output", EXPECTED_STRING, result.toString()); | assertEquals("multi reader failed to get expected output", EXPECTED_STRING, result.toString()); | ||||
} | } | ||||
public static final String TEST_STRING_INCLUDE_MATCH = "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">\n<meta charset=\"utf-8\">something</html>\n"; | |||||
public static final String EXPECTED_STRING_INCLUDE_MATCH = "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en\">INSERTED_DATA\n<meta charset=\"utf-8\">something</html>\n"; | |||||
@Test public void testRegexReaderIncludeMatch() throws Exception { | |||||
final Reader reader = new StringReader(TEST_STRING_INCLUDE_MATCH); | |||||
final RegexStreamFilter regexStreamFilter = new RegexReplacementFilter("<html\\s+[^>]*>", "!INSERTED_DATA"); | |||||
final RegexFilterReader regexFilterReader = new RegexFilterReader(reader, 1024, regexStreamFilter); | |||||
final StringWriter result = new StringWriter(); | |||||
IOUtils.copyLarge(regexFilterReader, result); | |||||
assertEquals("multi reader failed to get expected output", EXPECTED_STRING_INCLUDE_MATCH, result.toString()); | |||||
} | |||||
public static final String MULTI_TEST_STRING_1 = "this is a multi-stream test string\nthat should has a lot of stuff"; | public static final String MULTI_TEST_STRING_1 = "this is a multi-stream test string\nthat should has a lot of stuff"; | ||||
public static final String MULTI_TEST_STRING_2 = "in it but why should that matter?\nit is a bad thing to have multiple streams?"; | public static final String MULTI_TEST_STRING_2 = "in it but why should that matter?\nit is a bad thing to have multiple streams?"; | ||||
public static final String MULTI_TEST_STRING_3 = "maybe some people think so\nbut a good person would never say that"; | public static final String MULTI_TEST_STRING_3 = "maybe some people think so\nbut a good person would never say that"; | ||||