From 3576f6e42e66fa78647b03d29d24d22933e37563 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 6 May 2021 18:38:50 +0000 Subject: [PATCH 1/2] BAEL-4878 | How to split a string, but also keep the delimiters? --- .../SplitAndKeepDelimitersUnitTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java diff --git a/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java b/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java new file mode 100644 index 0000000000..7a9e0cd710 --- /dev/null +++ b/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java @@ -0,0 +1,53 @@ +package com.baeldung.splitkeepdelimiters; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.regex.Pattern; + +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; + +import com.google.common.base.Splitter; + +public class SplitAndKeepDelimitersUnitTest { + + private final String positivelookAheadRegex = "((?=@))"; + private final String positivelookBehindRegex = "((?<=@))"; + private final String positivelookAroundRegex = "((?=@)|(?<=@))"; + private final String positiveLookAroundMultiDelimiterRegex = "((?<=;|:|,|#|@|~)|(?=;|:|,|#|@|~))"; + + private String text = "Hello@World@This@Is@A@Java@Program"; + private String textMixed = "@Hello;World@This:Is,A#Java~Program"; + private String textMixed2 = "pg-no.10@hello;world@this:is,a#10words|Java~Program"; + + @Test + public void givenString_splitAndKeepDelimiters_using_javaLangString() { + + assertThat(text.split(positivelookAheadRegex)).containsExactly("Hello", "@World", "@This", "@Is", "@A", "@Java", "@Program"); + + assertThat(text.split(positivelookBehindRegex)).containsExactly("Hello@", "World@", "This@", "Is@", "A@", "Java@", "Program"); + + assertThat(text.split(positivelookAroundRegex)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); + + assertThat(textMixed.split(positiveLookAroundMultiDelimiterRegex)).containsExactly("@", "Hello", ";", "World", "@", "This", ":", "Is", ",", "A", "#", "Java", "~", "Program"); + + } + + @Test + public void givenString_splitAndKeepDelimiters_using_ApacheCommonsLang3StringUtils() { + + assertThat(StringUtils.splitByCharacterType(textMixed2)).containsExactly("pg", "-", "no", ".", "10", "@", "hello", ";", "world", "@", "this", ":", "is", ",", "a", "#", "10", "words", "|", "J", "ava", "~", "P", "rogram"); + + } + + @Test + public void givenString_splitAndKeepDelimiters_using_GuavaSplitter() { + + assertThat(Splitter.onPattern(positiveLookAroundMultiDelimiterRegex) + .splitToList(textMixed)).containsExactly("@", "Hello", ";", "World", "@", "This", ":", "Is", ",", "A", "#", "Java", "~", "Program"); + + assertThat(Splitter.on(Pattern.compile(positiveLookAroundMultiDelimiterRegex)) + .splitToList(textMixed)).containsExactly("@", "Hello", ";", "World", "@", "This", ":", "Is", ",", "A", "#", "Java", "~", "Program"); + + } +} From 0074cefddb056bdc962caf0f505d6cdd0b9eb589 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 9 May 2021 20:25:34 +0000 Subject: [PATCH 2/2] BAEL-4878 | How to split a string, but also keep the delimiters? | moved src --- .../SplitAndKeepDelimitersUnitTest.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) rename core-java-modules/{core-java-string-operations => core-java-string-operations-3}/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java (63%) diff --git a/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java similarity index 63% rename from core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java rename to core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java index 7a9e0cd710..ede8be4c05 100644 --- a/core-java-modules/core-java-string-operations/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/splitkeepdelimiters/SplitAndKeepDelimitersUnitTest.java @@ -14,11 +14,11 @@ public class SplitAndKeepDelimitersUnitTest { private final String positivelookAheadRegex = "((?=@))"; private final String positivelookBehindRegex = "((?<=@))"; private final String positivelookAroundRegex = "((?=@)|(?<=@))"; - private final String positiveLookAroundMultiDelimiterRegex = "((?<=;|:|,|#|@|~)|(?=;|:|,|#|@|~))"; + private final String positiveLookAroundMultiDelimiterRegex = "((?=:|#|@)|(?<=:|#|@))"; private String text = "Hello@World@This@Is@A@Java@Program"; - private String textMixed = "@Hello;World@This:Is,A#Java~Program"; - private String textMixed2 = "pg-no.10@hello;world@this:is,a#10words|Java~Program"; + private String textMixed = "@HelloWorld@This:Is@A#Java#Program"; + private String textMixed2 = "pg@no;10@hello;world@this;is@a#10words;Java#Program"; @Test public void givenString_splitAndKeepDelimiters_using_javaLangString() { @@ -29,25 +29,31 @@ public class SplitAndKeepDelimitersUnitTest { assertThat(text.split(positivelookAroundRegex)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); - assertThat(textMixed.split(positiveLookAroundMultiDelimiterRegex)).containsExactly("@", "Hello", ";", "World", "@", "This", ":", "Is", ",", "A", "#", "Java", "~", "Program"); + assertThat(textMixed.split(positiveLookAroundMultiDelimiterRegex)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program"); } @Test public void givenString_splitAndKeepDelimiters_using_ApacheCommonsLang3StringUtils() { - assertThat(StringUtils.splitByCharacterType(textMixed2)).containsExactly("pg", "-", "no", ".", "10", "@", "hello", ";", "world", "@", "this", ":", "is", ",", "a", "#", "10", "words", "|", "J", "ava", "~", "P", "rogram"); + assertThat(StringUtils.splitByCharacterType(textMixed2)).containsExactly("pg", "@", "no", ";", "10", "@", "hello", ";", "world", "@", "this", ";", "is", "@", "a", "#", "10", "words", ";", "J", "ava", "#", "P", "rogram"); } @Test public void givenString_splitAndKeepDelimiters_using_GuavaSplitter() { + assertThat(Splitter.onPattern(positivelookAroundRegex) + .splitToList(text)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); + + assertThat(Splitter.on(Pattern.compile(positivelookAroundRegex)) + .splitToList(text)).containsExactly("Hello", "@", "World", "@", "This", "@", "Is", "@", "A", "@", "Java", "@", "Program"); + assertThat(Splitter.onPattern(positiveLookAroundMultiDelimiterRegex) - .splitToList(textMixed)).containsExactly("@", "Hello", ";", "World", "@", "This", ":", "Is", ",", "A", "#", "Java", "~", "Program"); + .splitToList(textMixed)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program"); assertThat(Splitter.on(Pattern.compile(positiveLookAroundMultiDelimiterRegex)) - .splitToList(textMixed)).containsExactly("@", "Hello", ";", "World", "@", "This", ":", "Is", ",", "A", "#", "Java", "~", "Program"); + .splitToList(textMixed)).containsExactly("@", "HelloWorld", "@", "This", ":", "Is", "@", "A", "#", "Java", "#", "Program"); } }