если существует любые буквы или буквы + \n или отдельно \n то текст валиден.
Ответ: ^[a-zA-Z]*\n?$
Примеры:
/^[a-zA-Z]*\n?$/.test("asd") //true
/^[a-zA-Z]*\n?$/.test("asd\n") //true
/^[a-zA-Z]*\n?$/.test("asd\n\n") //false
/^[a-zA-Z]*\n?$/.test("asd asd") //false
/^[a-zA-Z]*\n?$/.test("123") //false
/^[a-zA-Z]*\n?$/.test("asd123") //false
/^[a-zA-Z]*\n?$/.test("\nasd") //false
/^[a-zA-Z]*\n?$/.test("\n") //true
/^[a-zA-Z]*\n?$/.test("") //true
P.S. "Любые буквы" включает также и их отсутствие, т.к. на пустом множестве верно любое утверждение. Если пустота не валидна, то это нужно оговаривать (и проверять) отдельно.
P.P.S. Обычно перед тем, как скармливать "грязный" текст регулярному выражению, полезно выполнить
.trim()
, чтобы убрать пробельные символы в начале и в конце текста (но не в середине). Это избавит от необходимости помнить, что в конце может быть \n или случайно нажатый пробел (например, при вводе логина или пароля) и т.п.