From 06c65d31f23c0c9e6d2b1df9c749acae01eaa769 Mon Sep 17 00:00:00 2001 From: Kai Yuan Date: Sat, 26 Aug 2023 16:23:29 +0200 Subject: [PATCH] [indexes-of-matches] Get the Indexes of Regex Pattern Matches in Java (#14648) --- .../IndexesOfMatchesUnitTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/indexesofmatches/IndexesOfMatchesUnitTest.java diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/indexesofmatches/IndexesOfMatchesUnitTest.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/indexesofmatches/IndexesOfMatchesUnitTest.java new file mode 100644 index 0000000000..7fb2afcdea --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/indexesofmatches/IndexesOfMatchesUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.regex.indexesofmatches; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.junit.jupiter.api.Test; + +public class IndexesOfMatchesUnitTest { + private static final String INPUT = "This line contains , , and ."; + + @Test + void whenUsingNorCharClass_thenGetExpectedTexts() { + Pattern pattern = Pattern.compile("<[^>]*>"); + Matcher matcher = pattern.matcher(INPUT); + List result = new ArrayList<>(); + while (matcher.find()) { + result.add(matcher.group()); + } + assertThat(result).containsExactly("", "", ""); + } + + @Test + void whenCallingMatcherEnd_thenGetIndexesAfterTheMatchSequence() { + Pattern pattern = Pattern.compile("456"); + Matcher matcher = pattern.matcher("0123456789"); + String result = null; + int startIdx = -1; + int endIdx = -1; + if (matcher.find()) { + result = matcher.group(); + startIdx = matcher.start(); + endIdx = matcher.end(); + } + assertThat(result).isEqualTo("456"); + assertThat(startIdx).isEqualTo(4); + assertThat(endIdx).isEqualTo(7); + } + + @Test + void whenUsingMatcherStartAndEnd_thenGetIndexesOfMatches() { + Pattern pattern = Pattern.compile("<[^>]*>"); + Matcher matcher = pattern.matcher(INPUT); + List result = new ArrayList<>(); + Map indexesOfMatches = new LinkedHashMap<>(); + while (matcher.find()) { + result.add(matcher.group()); + indexesOfMatches.put(matcher.start(), matcher.end()); + } + assertThat(result).containsExactly("", "", ""); + assertThat(indexesOfMatches.entrySet()).map(entry -> INPUT.substring(entry.getKey(), entry.getValue())) + .containsExactly("", "", ""); + } + + @Test + void whenUsingMatcherStartAndEndWithGroupIdx_thenGetIndexesOfMatches() { + Pattern pattern = Pattern.compile("<([^>]*)>"); + Matcher matcher = pattern.matcher(INPUT); + List result = new ArrayList<>(); + Map indexesOfMatches = new LinkedHashMap<>(); + while (matcher.find()) { + result.add(matcher.group(1)); + indexesOfMatches.put(matcher.start(1), matcher.end(1)); + } + assertThat(result).containsExactly("the first value", "the second value", "the third value"); + + assertThat(indexesOfMatches.entrySet()).map(entry -> INPUT.substring(entry.getKey(), entry.getValue())) + .containsExactly("the first value", "the second value", "the third value"); + } +} \ No newline at end of file