I'm writing a regex for a simple username validation for practice. While I am sure there may be other issues with this pattern, I would like it if someone could explain this seemingly odd behavior I am getting.
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class userRegex{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int testCases = Integer.parseInt(in.nextLine());
while(testCases>0){
String username = in.nextLine();
String pattern = "([[:alpha:]])[a-zA-Z_]{7,29}";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(username);
if (m.find( )) {
System.out.println("Valid");
} else {
System.out.println("Invalid");
}
testCases--;
}
}
}
When I input:
2
dfhidbuffon
dfdidbuffon
the compiler should return:
Valid
Valid
but instead, it returns
Valid
Invalid
Why does it discriminate between the difference of the 3rd letter being "h" or "d" in each of the usernames?
Edit: Added @Draco18s and @ruakh 's suggestions, however, I am still getting the same strange behaviour.
[:alpha:]
doesn't have the special meaning that you intend; rather, it ends up just meaning "any of the characters :
, a
, h
, l
, p
". So dfhidbuffon
contains a match for your pattern (namely h
plus idbuffon
), whereas dfdidbuffon
does not. (Note that matcher.find()
looks for any match within the string; if you want to specifically match the entire string, you should use matcher.matches()
, or you can modify your pattern to use anchors such as ^
and $
.)
You may be thinking of the notation found in many regex implementations whereby [:alpha:]
means "any alphabetic character"; but firstly, Java's Pattern
class doesn't support that notation (hat-tip to ajb for pointing this out), and secondly, those languages would require [:alpha:]
to appear inside a character class, e.g. as [[:alpha:]]
. The Java equivalent would be \p{Alpha}
or [A-Za-z]
if you only want to match ASCII letters, and \p{IsAlphabetic}
if you want to match any Unicode letter.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With