首页 > 解决方案 > 正则表达式:不是所有的空白,但允许某些字符,有限制

问题描述

试图提出一个正则表达式或正则表达式的组合,如果 a) 他们只输入了空白,或者他们 b) 输入了“非法”字符,则返回 False。最后,字符数是有限制的。

到目前为止,我最接近的是下面。它失败的地方是它不计算任何前导空格;只有非空白被计算在内,所以它失败了。使用 js。

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

编辑:我认为上面是不正确的,我打算发布这个:

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

编辑 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

标签: regexwhitespace

解决方案


更新 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). IMO 这使您的意图更清晰,并且您的代码可能更具可读性,从而为您提供了这个易于阅读的正则表达式:

# matches any string containing a *bad* character
const re4 = /[\!-\~\u2018-\u201d\u2013\u2014]/;

如果您使用 trim 进行全空白检查,您可能会将您的正则表达式转换为肯定断言,即使有长度限制:

# matches any string consisting of 1-10 characters not considered *bad*
const re4 = /^[^\!-\~\u2018-\u201d\u2013\u2014]{1,10}$/;

推荐阅读