Все виды способов написать это, и так как вы используете Java, почему бы не использовать "функцию" Java regex? : D
String regexString = "(?<!\\s+)[\\w\\s&&[^_]]{0,20}";
Разбитый, это говорит:
(?<!\\s+) # not following one or more whitespace characters,
[ # match one of the following:
\\w # word character (`a-z`, `A-Z`, `0-9`, and `_`)
\\s # whitespace characters
&&[^_] # EXCEPT FOR `_`
] #
{0,20} # between 0 and 20 times
Он будет соответствовать a-z
, A-Z
, 0-9
и пробелам, даже если \ w в противном случае будет содержать подчеркивания, дополнительная часть там говорит, что НЕ подчеркивает - я думаю, это уникально для Java ... в любом случае это было весело!