You can use:
String pattern = "^[A-Za-z_][A-Za-z0-9_]{7,29}$";
^[A-Za-z_] provides input with alphabet or underscore, and then [A-Za-z0-9_]{7,29}$ ensures that there will be 7 to 29 word characters at the end, making the total length 8 to 30 .
Or you can shorten it to:
String pattern = "^[A-Za-z_]\\w{7,29}$";
You regex is trying to match 8-30 copies ([A-Za-z_][A-Za-z0-9_]*) , which means starting with an alphabet or underscore followed by the word char of any length.
source share