Как правильно написать регулярное выражение?

Подскажите, пожалуйста, как правильно написать следующее регулярное выражение:

Можно ввести любые символы и цифры. Если количество введенных символов и цифр превышает двадцать, то будет ошибка. Если в поле пользователь ввел только пробел(ы) без символов, то будет ошибка. Предполагается, что минимум один символ должен быть введен.

Я написал следующее решение, но не уверен, что оно подходящее:

\S.{0,20}

Твое регулярное выражение говорит следующее:
“Возьми любые от 1 до 21 символа, которые не начинаются с пробела”
То есть в строке из 10 символов, первый из которых - пробел, он возьмет последние 9.
В строке из 100 символов, в которой нет ни одного пробела, он возьмет первые 21 (но ошибку не выкинет).
Если будет 21 символ, из которых первые 20 - пробелы, то он возьмет только последний.

Не уверен, можно ли то что ты хочешь сделать одной регуляркой, но можно сделать за несколько операций:

const string = "   test";
// если строка не пустая
// и в ней до 20 символов
// и есть хотя бы один не пробел
if (string && string.length >= 20 && string.match(/\S/)) {
    console.log("I'm a valid string");
}

Если не подходит, то можешь попробовать поиграться со всякими ^ и $:
^\S.{1,19}$ - но она выбросит все строки, которые начинаются с пробела
Или наоборот, проверить, что строка содержит только пробелы:
^\s+$ - но она не принимает во внимание общее количество символов.

1 Симпатия