I’m trying to create a Regex String with the following rules
- The username is between 4 and 25 characters.
- It must start with a letter.
- It can only contain letters, numbers, and the underscore character.
- It cannot end with an underscore character.
when it meets this criterion I want the output to be true otherwise false, but I only get false for my test cases, here is my code
public class Profile { public static String username(String str) { String regularExpression = "^[a-zA-Z][a-zA-Z0-9_](?<=@)\w+\b(?!\_){4,25}$"; if (str.matches(regularExpression)) { str = "true"; } else if (!str.matches(regularExpression)) { str = "false"; } return str; }
Main class
Profile profile = new profile(); Scanner s = new Scanner(System.in); System.out.print(profile.username(s.nextLine()));
input
"aa_" "u__hello_world123"
output
false false
Fixed: thanks to everyone who contributed
Advertisement
Answer
You can use
^[a-zA-Z][a-zA-Z0-9_]{3,24}$(?<!_) ^[a-zA-Z]w{3,24}$(?<!_) ^[a-zA-Z][a-zA-Z0-9_]{2,23}[a-zA-Z0-9]$ ^p{Alpha}[a-zA-Z0-9_]{2,23}p{Alnum}$
See the regex demo.
Details:
^
– start of string[a-zA-Z]
– an ASCII letter[a-zA-Z0-9_]{3,24}
/w{3,24}
– three to twenty four ASCII letters, digits or underscores$
– end of string(?<!_)
– a negative lookbehind that makes sure there is no_
(at the end of string).
Note that {3,24}
is used and not {4,25}
because the first [a-zA-Z]
pattern already matches a single char.
Usage:
public static String username(String str) { return Boolean.toString( str.trim().matches("[a-zA-Z]\w{3,24}$(?<!_)") ); // return Boolean.toString( str.trim().matches("\p{Alpha}[a-zA-Z0-9_]{2,23}\p{Alnum}") ); // return Boolean.toString( str.trim().matches("[a-zA-Z][a-zA-Z0-9_]{2,23}[a-zA-Z0-9]") ); }
See Java demo:
import java.util.*; import java.util.regex.*; class Ideone { public static String username(String str) { return Boolean.toString( str.trim().matches("[a-zA-Z]\w{3,24}$(?<!_)") ); } public static void main (String[] args) throws java.lang.Exception { System.out.println(username("u__hello_world123")); // => true System.out.println(username("aa_")); // => false } }