Click here to Skip to main content
15,357,967 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I have a class with field begDate to be validated:

Java
@Data
@Entity
public class Booking
{
    @Id
    @GeneratedValue
    @Type(type = "uuid-char")
    private UUID   uuid;

    // there are many more fields and nothing more, the most of them aren't to validate and don't have annotations
    
    @NotEmpty
    @Pattern(regexp = "^(0$|[^0]\\d{0,19}$)", flags = Pattern.Flag.MULTILINE)
    @Length(min = 1, max = 20)
    private String begDate;

}

The idea is to match either line, consisting of only one zero or line, consisting of 0 or more numbers NOT beginning with zero. I've tested this expression here, and as you can see it works — the lines, beginning with zero don't match.

However, calling

Java
validator.validateProperty(obj, "begDate")

on an object, containing begDate equal to '09980514122516231246' (the lowest line in the linked example)

Java
@Pattern(regexp = "^(0$|[^0]\d{0,19}$)", flags = Pattern.Flag.MULTILINE)
@Length(min = 1, max = 20)
private String begDate;

doesn't return any error. Nonetheless, the simpler expressions work as expected — validation of the following property

Java
@NotEmpty
@Pattern(regexp = "[0-9]{13} {4}")
@Length(min = 17, max = 17)
private String orderNr;

set to 'sdf5555555550' will return a set of ConstraintViolations, consisting of one element (as expected).

I am a bit confused, because regex101.com understands my regex (I also tried all flavors). Are there any limitations on regular expression inside @Pattern or maybe jakarta uses some specific dialect?

For further clarity, here are the strings, that should validate:

19980514122516231246

19990514122516231246

19980524561516231246

0

And the strings, that shouldn't:

09980514122516231246

00980514122516231246

00

Now all of the lines above are successfully validated. Important: I always get only one line of string without any carriage returns, every new value of begDate gets validated in a new iteration.

What I have tried:

I tried to play with regexp itself, adding/removing $ at the end; tried it with and without MULTILINE flag.
Posted
Updated 6-Feb-22 23:25pm

Try this one:
^(([1..9]\d{0,19})|(0))$
   
Just a few interesting links to help building and debugging RegEx.
Here is a link to RegEx documentation:
perlre - perldoc.perl.org[^]
Here is links to tools to help build RegEx and debug them:
.NET Regex Tester - Regex Storm[^]
Expresso Regular Expression Tool[^]
RegExr: Learn, Build, & Test RegEx[^]
Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript[^]
This one show you the RegEx as a nice graph which is really helpful to understand what is doing a RegEx: Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.[^]
This site also show the Regex in a nice graph but can't test what match the RegEx: Regexper[^]
   

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900