diff --git a/core-java-modules/core-java-regex-2/pom.xml b/core-java-modules/core-java-regex-2/pom.xml new file mode 100644 index 0000000000..45e19ba5a5 --- /dev/null +++ b/core-java-modules/core-java-regex-2/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + core-java-regex-2 + 0.1.0-SNAPSHOT + core-java-regex-2 + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + ../ + + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + 3.15.0 + + + diff --git a/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/noncapturinggroups/NonCapturingGroupUnitTest.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/noncapturinggroups/NonCapturingGroupUnitTest.java new file mode 100644 index 0000000000..281a550f34 --- /dev/null +++ b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/regex/noncapturinggroups/NonCapturingGroupUnitTest.java @@ -0,0 +1,119 @@ +package com.baeldung.regex.noncapturinggroups; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class NonCapturingGroupUnitTest { + + private static final Pattern SIMPLE_URL_PATTERN = Pattern.compile("[^:]+://(?:[.a-z]+/?)+"); + private static final Pattern SCOPED_CASE_INSENSITIVE_URL_PATTERN = Pattern.compile("[^:]+://(?i:[.a-z]+/?)+"); + private static final Pattern SIMPLE_URL_PATTERN_WITH_SPECIFIC_ENDING_PATH = Pattern.compile("[^:]+://(?:[.a-z]+/?)+?/ending-path"); + private static final Pattern SCOPED_CASE_INSENSTIIVE_URL_PATTERN_WITH_ENDING_PATH = Pattern.compile("[^:]://(?i:[.a-z]+/?)+?/ending-path"); + private static final Pattern CASE_INSENSITIVE_URL_PATTERN = Pattern.compile("[^:]+://(?:[.a-z]+/?)+?(/ending-path)", Pattern.CASE_INSENSITIVE); + private static final Pattern SCOPED_CASE_SENSITIVE_URL_PATTERN = Pattern.compile("[^:]+://(?-i:[.a-z]+/?)+?(/ending-path)", Pattern.CASE_INSENSITIVE); + private static final Pattern INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH = Pattern.compile("[^:]+://(?>[.a-z]+/?)+/ending-path"); + private static final Pattern INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH_AND_BACKTRACKING = Pattern.compile("[^:]+://(?>(?:[.a-z]+/?)+/)ending-path"); + + @Test + void givenSimpleUrlPattern_whenValidUrlProvided_thenMatches() { + Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + Assertions.assertThatThrownBy(() -> urlMatcher.group(1)).isInstanceOf(IndexOutOfBoundsException.class); + } + + @Test + void whenSimpleUrlProvidedWithPathProvided_thenMatches() { + Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/live"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + } + + @Test + void whenSimpleUrlProvidedWithPathEndingWithSlashProvided_thenMatches() { + Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/live/"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + } + + @Test + void givenSimpleUrlPattern_whenUrlWithMultiplePathSegmentsProvided_thenMatches() { + Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.microsoft.com/some/other/url/path"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + } + + @Test + void whenUrlWithUppercaseCharactersProvided_thenDoesNotMatch() { + Matcher urlMatcher = SIMPLE_URL_PATTERN.matcher("http://www.Microsoft.com/"); + + Assertions.assertThat(urlMatcher.matches()).isFalse(); + } + + @Test + void givenPatternWithCaseInsensitiveGroup_whenUrlHasUppercaseCharactersInsideOfScope_thenMatches() { + Matcher urlMatcher = SCOPED_CASE_INSENSITIVE_URL_PATTERN.matcher("http://www.Microsoft.com/"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + } + + @Test + void givenCaseInsensitivePattern_whenUrlHasUppercaseCharacters_thenMatches() { + Matcher urlMatcher = CASE_INSENSITIVE_URL_PATTERN.matcher("http://www.Microsoft.com/Ending-path"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + Assertions.assertThat(urlMatcher.group(1)).isEqualTo("/Ending-path"); + } + + @Test + void givenPatternWithCaseInsensitiveGroup_whenUrlHasUppercaseCharactersOutsideOfScope_thenMatchFails() { + Matcher urlMatcher = SCOPED_CASE_INSENSTIIVE_URL_PATTERN_WITH_ENDING_PATH.matcher("http://www.Microsoft.com/Ending-path"); + + Assertions.assertThat(urlMatcher.matches()).isFalse(); + } + + @Test + void givenPatternAllowingBacktracking_whenUrlWithEndingPathCausingBacktrackingProvided_thenMatches() { + Matcher urlMatcher = SIMPLE_URL_PATTERN_WITH_SPECIFIC_ENDING_PATH.matcher("http://www.microsoft.com/ending-path"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + } + + @Test + void givenPatternWithIndependentNonCapturingGroup_whenBacktrackingOccurs_thenDoesNotMatch() { + Matcher independentMatcher = INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH.matcher("http://www.microsoft.com/ending-path"); + + Assertions.assertThat(independentMatcher.matches()).isFalse(); + } + + @Test + void givenPatternWithIndependentNonCapturingGroup_whenBacktrackingDoesNotOccur_thenMatches() { + Matcher independentMatcher = INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH.matcher("http://www.microsoft.com//ending-path"); + + Assertions.assertThat(independentMatcher.matches()).isTrue(); + } + + @Test + void givenPatternWithIndependentNonCapturingGroup_whenBacktrackingOccursInsideGroup_thenMatches() { + Matcher independentMatcher = INDEPENDENT_URL_PATTERN_WITH_ENDING_PATH_AND_BACKTRACKING.matcher("http://www.microsoft.com/ending-path"); + + Assertions.assertThat(independentMatcher.matches()).isTrue(); + } + + @Test + void givenCaseInsensitivePatternWithCaseSensitivieSubPattern_whenUrlWithUppercaseCharactersOutsideOfScopeProvided_thenMatches() { + Matcher urlMatcher = SCOPED_CASE_SENSITIVE_URL_PATTERN.matcher("http://www.microsoft.com/ENDING-PATH"); + + Assertions.assertThat(urlMatcher.matches()).isTrue(); + } + + @Test + void givenCaseInsensitivePatternWithCaseSensitivieSubPattern_whenUrlWithUppercaseCharactersInsideOfScopeProvided_thenDoesNotMatch() { + Matcher urlMatcher = SCOPED_CASE_SENSITIVE_URL_PATTERN.matcher("http://www.Microsoft.com/ending-path"); + + Assertions.assertThat(urlMatcher.matches()).isFalse(); + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 4b80e7f0ed..8661f1ba01 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -113,6 +113,7 @@ core-java-string-operations-2 core-java-sun core-java-regex + core-java-regex-2 pre-jpms @@ -137,4 +138,4 @@ 2.22.2 5.6.2 - \ No newline at end of file +