Обновление 2 : Узнав, что вы не можете инвертировать результат совпадения в коде, вот последнее предложение с использованием отрицательного просмотра вперед (как вы уже пробовали сами).
Это регулярное выражение соответствует только строкам из 1-10 незапрещенных символов, которые не все пробелы:
const re4 = /^(?!\s+$)[^\!-\~\u2018-\u201d\u2013\u2014]{1,10}$/
Обновление 1 : Используйте это регулярное выражение для сопоставления строки с пробелами ИЛИ строк длиной более 10 символов ИЛИ строк, содержащих недопустимые символы:
const re4 = /(^\s+$|^.{11,}$|[\!-\~\u2018-\u201d\u2013\u2014])/
Я понимаю, что вы хотите наложить ограничение на длину с помощью регулярного выражения. Я бы против этого и рекомендовал использовать вместо него str.length
.
Это регулярное выражение будет соответствовать строкам, состоящим только из пробелов, и строкам, содержащим один или несколько недопустимых символов:
const re4 = /(^\s+$|[\!-\~\u2018-\u201d\u2013\u2014])/;
Относительно запрета строк, содержащих только пробелы, : вместо его упаковки в регулярное выражение, вы можете подумать об использовании чего-то более явного, например if (s.trim().length == 0)
. ИМО, это делает ваше намерение более ясным, а ваш код, вероятно, более читаемым, оставляя вас с этим легко читаемым регулярным выражением:
# matches any string containing a *bad* character
const re4 = /[\!-\~\u2018-\u201d\u2013\u2014]/;
Если вы используете обрезку для проверки всех пробелов, вы можете преобразовать свое регулярное выражение в положительное утверждение, даже с ограничением длины:
# matches any string consisting of 1-10 characters not considered *bad*
const re4 = /^[^\!-\~\u2018-\u201d\u2013\u2014]{1,10}$/;