0
[a-zA-Z0-9\@\#\$\%\&\*\(\)\-\_\+\]\[\'\;\:\?\.\,\!\^]+$ 

有效的输出是: reahb543)(*&&!@#$%^kshABmhbahdxb!@$@#%6813741646

这是我的表达方式。但我只需要8 到 32 位的值。

所以一个有效的字符串是:

  • 8 到 32 个字符长
  • 包括数字、字母、特殊字符
4

1 回答 1

4

描述

我会改变你的表达方式:

  • 字符类中的所有字符转义都是不必要的
  • 将字符类中的破折号移到末尾,因为该字符在字符类中确实具有特殊含义,并且需要位于类的末尾或开头
  • 添加前瞻以强制字符串中所需的位数
  • 添加一个起始字符串锚以要求阻止字符串匹配可能包含更多数字的较长字符串然后允许

该表达式将:

  • 要求字符串包含 8 到 32 位数字,不允许多或少
  • 允许来自您的字符集中的任意数量的字符(前提是此处的其他规则也是如此)
  • 允许数字显示为字符串的第一个或最后一个字符

^(?=(?:\D*?\d){8,32}(?!.*?\d))[a-zA-Z0-9@\#$%&*()_+\]\[';:?.,!^-]+$

在此处输入图像描述

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (between 8 and
                             32 times (matching the most amount
                             possible)):
--------------------------------------------------------------------------------
      \D*?                     non-digits (all but 0-9) (0 or more
                               times (matching the least amount
                               possible))
--------------------------------------------------------------------------------
      \d                       digits (0-9)
--------------------------------------------------------------------------------
    ){8,32}                  end of grouping
--------------------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
      .*?                      any character except \n (0 or more
                               times (matching the least amount
                               possible))
--------------------------------------------------------------------------------
      \d                       digits (0-9)
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  [a-zA-Z0-                any character of: 'a' to 'z', 'A' to 'Z',
  9@\#$%&*()_+\]\[';:?     '0' to '9', '@', '\#', '$', '%', '&', '*',
  .,!^-]+                  '(', ')', '_', '+', '\]', '\[', ''', ';',
                           ':', '?', '.', ',', '!', '^', '-' (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string

例子

现场演示

样品

reahb)(*&&!@#$%^kshABmhbahdxb!@$@#%1234567   = bad
reahb)(*&&!@#$%^kshABmhbahdxb!@$@#%12345678  = good
1234reahb)(*&&!@#$%^kshABmhbahdxb!@$@#%5678  = good
1234reahb)(*&&!@#$%^kshABmhbahdxb!@$@#%5678901234567890123456789012   = good
1234reahb)(*&&!@#$%^kshABmhbahdxb!@$@#%56789012345678901234567890123  = bad
reahb)(*&&!@12345678901234567890123456789012#$%^kshABmhbahdxb!@$@#%   = good
reahb)(*&&!@123456789012345678901234567890123#$%^kshABmhbahdxb!@$@#%  = bad



或者

如果您希望从您的字符类中只允许任何类型的 8-32 个字符,那么将起作用:

^[a-zA-Z0-9@\#$%&*()_+\]\[';:?.,!^-]{8,32}$

在此处输入图像描述

于 2013-08-28T01:01:13.810 回答