Это регулярное выражение должно выполнять эту работу: /^[a-zA-Z\d]*[a-zA-Z][a-zA-Z\d]*^/
Имейте в виду, это регулярное выражение потенциально может значительно откатиться назад;это будет O(N^2)
в худшем случае.Если сделать первое повторение ленивым, а не нетерпеливым, то регулярное выражение будет быстрее ... если оно будет соответствовать.Способ ускорить случай отсутствия совпадений - использовать два регулярных выражения.
Или, что еще лучше, вообще не используйте регулярные выражения и сопоставьте код в простом Java:
public boolean matchSymbol (String input) {
boolean seenLetter = false;
final int len = input.length();
for (int i = 0; i < len; i++) {
char ch = input.charAt(i);
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') {
seenLetter = true;
} else if (ch < '0' || ch > '9') {
return false;
}
}
return seenLetter;
}
Для строки из N символов это успешно выполняется в итерациях цикла N
или не выполняется в(обычно) менее N
итераций.