diff --git a/core-java-modules/core-java-string-operations-8/README.md b/core-java-modules/core-java-string-operations-8/README.md
new file mode 100644
index 0000000000..2dce44d217
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-8/README.md
@@ -0,0 +1,2 @@
+
+### Relevant Articles:
diff --git a/core-java-modules/core-java-string-operations-8/pom.xml b/core-java-modules/core-java-string-operations-8/pom.xml
new file mode 100644
index 0000000000..2495abccf8
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-8/pom.xml
@@ -0,0 +1,72 @@
+
+
+ 4.0.0
+ core-java-string-operations-8
+ core-java-string-operations-8
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${apache.commons.lang3.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+ org.liquibase
+ liquibase-core
+ 4.9.1
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.8.1
+ test
+
+
+ org.liquibase
+ liquibase-core
+ 4.9.1
+ test
+
+
+ junit
+ junit
+ 4.13.2
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 11
+ 11
+ 3.13.0
+ 1.10.0
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/emailandphonemasking/EmailAndPhoneMaskingUnitTest.java b/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/emailandphonemasking/EmailAndPhoneMaskingUnitTest.java
new file mode 100644
index 0000000000..e390c2d2cd
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-8/src/test/java/com/baeldung/emailandphonemasking/EmailAndPhoneMaskingUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.emailandphonemasking;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class EmailAndPhoneMaskingUnitTest {
+
+
+ String phoneNumber = "+12344567890";
+ String expectedMaskedPhoneNumber = "+*******7890";
+ String email = "testemailaddress@example.com";
+ String expectedMaskedEmail = "te**************@example.com";
+
+ @Test
+ public void givenEmailAddress_whenUsingStringManipulation_thenMaskEmail() {
+ int atIndex = email.indexOf('@');
+ String repeatedString = IntStream.range(0, atIndex - 2).mapToObj(i -> "*").collect(Collectors.joining());
+ String maskedPart = email.substring(0, atIndex - repeatedString.length()) + repeatedString;
+ String maskedEmail = maskedPart + email.substring(atIndex);
+ assertEquals(expectedMaskedEmail, maskedEmail);
+ }
+
+ @Test
+ public void givenEmailAddress_whenUsingRegex_thenMaskEmail() {
+ int atIndex = email.indexOf('@');
+ String regex = "(.{2})(.*)(@.*)";
+ String repeatedAsterisks = "*".repeat(atIndex - 2);
+ String maskedEmail = email.replaceAll(regex, "$1" + repeatedAsterisks + "$3");
+ assertEquals(expectedMaskedEmail, maskedEmail);
+ }
+
+
+ @Test
+ public void givenPhoneNumber_whenUsingStringManipulation_thenMaskPhone() {
+ String maskedPhoneNumber = phoneNumber.replaceAll("\\d(?=\\d{4})", "*");
+ assertEquals(expectedMaskedPhoneNumber, maskedPhoneNumber);
+ }
+
+ @Test
+ public void givenPhoneNumber_whenUsingRegex_thenMaskPhone() {
+ int lastDigitsIndex = phoneNumber.length() - 5;
+ String regex = "(\\+)(\\d+)(\\d{4})";
+ String repeatedAsterisks = "*".repeat(Math.max(0, lastDigitsIndex));
+ String maskedPhoneNumber = phoneNumber.replaceAll(regex, "$1" + repeatedAsterisks + "$3");
+ assertEquals(expectedMaskedPhoneNumber, maskedPhoneNumber);
+ }
+
+
+}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 227da74156..c30a240f4a 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -199,6 +199,7 @@
core-java-string-operations-2
core-java-string-operations-6
core-java-string-operations-7
+ core-java-string-operations-8
core-java-regex
core-java-regex-2
core-java-regex-3