Регулярное выражение: не все ПУСТОТЫ, но разрешены определенные символы с ограничением - PullRequest
0 голосов
/ 08 мая 2020

Попытка придумать Regex или комбинацию Regex, которая возвращает False, если а) они ввели только ПУСТО (-а), или они б) ввели "недопустимые" символы. Наконец, количество символов имеет установленный предел.

Ближайшее, что у меня есть, находится ниже. Если это не удается, то не учитываются начальные пробелы; подсчитываются только непустые значения, поэтому он не выполняется. Используя js.

const reg = /^(**[ ]***[!-~\u2018-\u201d\u2013\u2014]){1,10}$/;

EDIT : я думаю, что приведенное выше неверно, и я хотел опубликовать это:

const re4 = /^(?!\s*$)[!-~\u2018-\u201d\u2013\u2014]{1,10}$/;

EDIT 2: это имеет меньше беспорядка; разрешить пробел и все другие «стандартные» символы клавиатуры:

const re5 = /^(?!\s*$)[!-~]{1,10}$/;

Таким образом, это говорит о том, что вы можете ввести кучу пробелов и должны включать как минимум 1 другой символ из следующего списка; но {1,10} учитывает только непробелы, поэтому в итоге я могу получить слишком много пробелов. РЕДАКТИРОВАТЬ:

Итак, используя re5 выше -

s = ' ';  // should fail
s = ' blah blah'; // should pass
s = '  blah blah';  // should fail, as there are 11 characters

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Попробуйте ^(?:\s*\S){1,10}\s*$
Разрешить 1-10 не белее, измените \S, чтобы разрешить символы

0 голосов
/ 10 мая 2020

Чтобы сопоставить ввод, когда он от 1 до 10 символов и не может быть все пробелы, используйте отрицательный просмотр вперед, чтобы утверждать не все пробелы:

^(?! *$).{1,10}

Если вы хотите ограничить допустимые символы , замените точку на подходящий класс символов для допустимых символов.

0 голосов
/ 08 мая 2020

Обновление 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}$/;
...