Skip to content

Commit fd9d956

Browse files
Igor Kugaudodaoire
authored andcommitted
BAEL-1351 RegEx for matching Date Pattern in Java (eugenp#3217)
* kugaudo/igor@kugaudo.com * BAEL-1351 RegEx for matching Date Pattern in Java * BAEL-1351 RegEx for matching Date Pattern in Java * BAEL-1351 RegEx for matching Date Pattern in Java * Fixed names of test methods * Refactored class names, split unit tests by classes * Reordered test cases in Gregorian date matcher unit test, formatted code * Added override annotation * Renamed mather main method for better semantics * Fixed names of test methods * Split Gregorian date matcher to separate branches * Fixed test cases according to the article * Revert "Merge branch 'master' into datepattern" This reverts commit 0d57456, reversing changes made to c768132.
1 parent 92789f9 commit fd9d956

16 files changed

Lines changed: 387 additions & 0 deletions
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.regexp.datepattern;
2+
3+
public interface DateMatcher {
4+
5+
boolean matches(String date);
6+
7+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.baeldung.regexp.datepattern;
2+
3+
import java.util.regex.Pattern;
4+
5+
class FormattedDateMatcher implements DateMatcher {
6+
7+
private static final Pattern DATE_PATTERN = Pattern.compile(
8+
"^\\d{4}-\\d{2}-\\d{2}$");
9+
10+
@Override
11+
public boolean matches(String date) {
12+
return DATE_PATTERN.matcher(date).matches();
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.baeldung.regexp.datepattern;
2+
3+
import java.util.regex.Pattern;
4+
5+
class RangedDateMatcher implements DateMatcher {
6+
7+
private static final Pattern DATE_PATTERN = Pattern.compile(
8+
"^((19|2[0-9])[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$");
9+
10+
@Override
11+
public boolean matches(String date) {
12+
return DATE_PATTERN.matcher(date).matches();
13+
}
14+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.baeldung.regexp.datepattern.gregorian;
2+
3+
import com.baeldung.regexp.datepattern.DateMatcher;
4+
5+
import java.util.regex.Pattern;
6+
7+
public class February29thMatcher implements DateMatcher {
8+
9+
private static final Pattern DATE_PATTERN = Pattern.compile(
10+
"^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$");
11+
12+
@Override
13+
public boolean matches(String date) {
14+
return DATE_PATTERN.matcher(date).matches();
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.baeldung.regexp.datepattern.gregorian;
2+
3+
import com.baeldung.regexp.datepattern.DateMatcher;
4+
5+
import java.util.regex.Pattern;
6+
7+
public class FebruaryGeneralMatcher implements DateMatcher {
8+
9+
private static final Pattern DATE_PATTERN = Pattern.compile(
10+
"^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$");
11+
12+
@Override
13+
public boolean matches(String date) {
14+
return DATE_PATTERN.matcher(date).matches();
15+
}
16+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.baeldung.regexp.datepattern.gregorian;
2+
3+
import com.baeldung.regexp.datepattern.DateMatcher;
4+
5+
import java.util.regex.Pattern;
6+
7+
class GregorianDateMatcher implements DateMatcher {
8+
9+
private static final Pattern DATE_PATTERN = Pattern.compile(
10+
"^((2000|2400|2800|(19|2[0-9](0[48]|[2468][048]|[13579][26])))-02-29)$"
11+
+ "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$"
12+
+ "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$"
13+
+ "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$");
14+
15+
@Override
16+
public boolean matches(String date) {
17+
return DATE_PATTERN.matcher(date).matches();
18+
}
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.regexp.datepattern.gregorian;
2+
3+
import com.baeldung.regexp.datepattern.DateMatcher;
4+
5+
import java.util.regex.Pattern;
6+
7+
public class MonthsOf30DaysMatcher implements DateMatcher {
8+
9+
private static final Pattern DATE_PATTERN = Pattern.compile(
10+
"^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$");
11+
12+
@Override
13+
public boolean matches(String date) {
14+
return DATE_PATTERN.matcher(date).matches();
15+
}
16+
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.regexp.datepattern.gregorian;
2+
3+
import com.baeldung.regexp.datepattern.DateMatcher;
4+
5+
import java.util.regex.Pattern;
6+
7+
public class MonthsOf31DaysMatcher implements DateMatcher {
8+
9+
private static final Pattern DATE_PATTERN = Pattern.compile(
10+
"^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$");
11+
12+
@Override
13+
public boolean matches(String date) {
14+
return DATE_PATTERN.matcher(date).matches();
15+
}
16+
17+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.regexp.datepattern;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
public class FormattedDateMatcherUnitTest {
7+
8+
private DateMatcher matcher = new FormattedDateMatcher();
9+
10+
@Test
11+
public void whenUsingFormattedDateMatcher_thenFormatConstraintsSatisfied() {
12+
Assert.assertTrue(matcher.matches("2017-12-31"));
13+
Assert.assertTrue(matcher.matches("2018-01-01"));
14+
Assert.assertTrue(matcher.matches("0000-00-00"));
15+
Assert.assertTrue(matcher.matches("1029-99-72"));
16+
17+
Assert.assertFalse(matcher.matches("2018-01"));
18+
Assert.assertFalse(matcher.matches("2018-01-01-01"));
19+
Assert.assertFalse(matcher.matches("2018-01-XX"));
20+
Assert.assertFalse(matcher.matches(" 2018-01-01"));
21+
Assert.assertFalse(matcher.matches("2018-01-01 "));
22+
Assert.assertFalse(matcher.matches("2018/01/01"));
23+
}
24+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.regexp.datepattern;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
6+
public class RangedDateMatcherUnitTest {
7+
8+
private DateMatcher matcher = new RangedDateMatcher();
9+
10+
@Test
11+
public void whenUsingRangedDateMatcher_thenFormatConstraintsSatisfied() {
12+
Assert.assertFalse(matcher.matches("2018-01"));
13+
Assert.assertFalse(matcher.matches("2018-01-01-01"));
14+
Assert.assertFalse(matcher.matches("2018-01-XX"));
15+
Assert.assertFalse(matcher.matches(" 2018-01-01"));
16+
Assert.assertFalse(matcher.matches("2018-01-01 "));
17+
Assert.assertFalse(matcher.matches("2018/01/01"));
18+
}
19+
20+
@Test
21+
public void whenUsingRangedDateMatcher_thenRangeConstraintsSatisfied() {
22+
Assert.assertTrue(matcher.matches("1900-01-01"));
23+
Assert.assertTrue(matcher.matches("2018-02-31"));
24+
Assert.assertTrue(matcher.matches("2999-12-31"));
25+
26+
Assert.assertFalse(matcher.matches("1899-12-31"));
27+
Assert.assertFalse(matcher.matches("2018-05-35"));
28+
Assert.assertFalse(matcher.matches("2018-13-05"));
29+
Assert.assertFalse(matcher.matches("3000-01-01"));
30+
}
31+
}

0 commit comments

Comments
 (0)