Я пробовал это:
private static void isLetterandNumberCombo(Tokens token) { if (token.getContents().matches("^(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]+$")){ token.setValid(false); } }
, но вход 123f45 все еще не устанавливает токен в действительный, как я думал, что это будет
Простое регулярное выражение выполнит эту работу:
Измените свою функцию на:
private static void isLetterandNumberCombo(Tokens token) { token.setValid(token.getContents() != null && token.getContents().matches("[a-zA-Z0-9]+")); }
Ваше решение в порядке. Вам просто нужно добавить регистр без учета регистра ((?i)), чтобы соответствовать строчным буквам. И matches() ищет полное совпадение, поэтому вам не нужны якоря в начале и в конце:
(?i)
matches()
(?i)(?=.*[A-Z])(?=.*[0-9])[A-Z0-9]+
Я бы пошел с:
^[A-Za-z\d]*(([A-Za-z]\d)|(\d[A-Za-z]))[A-Za-z\d]*$
Идея состоит в том, что допустимая строка будет иметь либо букву, за которой следует число, либо где-то противоположное, а также другие необязательные буквы или цифры до или после.
Дайте этому водовороту
private static boolean isLetterandNumberCombo(Tokens token) { String regex = "^[a-zA-Z0-9]+$"; Pattern pattern = Pattern.compile(regex); return pattern.matcher(token.getContents()).matches(); }
Вы вернете true или false, если токен действителен.