JS正则表达式看不懂?

const reg = /^(?!^\d+$)(?!^[a-z]+$)(?!^[A-Z]+$)(?!^[^a-z0-9]+$)(?!^[^A-Z0-9]+$)(?!^.*[\u4E00-\u9FA5].*$)^\S*$/

百度了一个大佬写的JS正则, 此正则的意思是验证字母、数字、特殊符号至少两种的组合.虽然验证了能用, 但是本人看不懂, 求大佬拆解一下具体的含义.

阅读 2.2k
6 个回答

具体解释如下:

  • ^ 表示匹配输入字符串的开始位置
  • (?!^\\d+$) 表示不允许全是数字
  • (?!^[a-z]+$) 表示不允许全是小写字母
  • (?!^[A-Z]+$) 表示不允许全是大写字母
  • (?!^[^a-z0-9]+$) 表示不允许全是除小写字母和数字之外的字符
  • (?!^[^A-Z0-9]+$) 表示不允许全是除大写字母和数字之外的字符
  • (?!^.*[\\u4E00-\\u9FA5].*$) 表示不允许包含中文字符
  • ^\\S*$ 表示匹配任何不包含空格的字符

from chatgpt

这个正则表达式用于匹配一个字符串,要求满足以下条件:

  • 字符串中不能全是数字、全是小写字母、全是大写字母、全是非字母数字字符或全是非大写字母数字字符;
  • 字符串中不能包含汉字(中文字符);
  • 字符串不能包含空格。

具体解释如下:

  • ^ 匹配字符串的开头;
  • (?!^\d+$) 负向前瞻,表示字符串开头不能全是数字;
  • (?!^[a-z]+$) 负向前瞻,表示字符串开头不能全是小写字母;
  • (?!^[A-Z]+$) 负向前瞻,表示字符串开头不能全是大写字母;
  • (?!^[^a-z0-9]+$) 负向前瞻,表示字符串开头不能全是非字母数字字符(即除了字母数字字符之外的字符);
  • (?!^[^A-Z0-9]+$) 负向前瞻,表示字符串开头不能全是非大写字母数字字符(即除了大写字母数字字符之外的字符);
  • (?!^.[\u4E00-\u9FA5].$) 负向前瞻,表示字符串中不能包含汉字(中文字符);
  • ^\S*$ 匹配除空格之外的任意字符,且该字符必须出现0次或多次,最后以字符串结尾 $ 结束。

综上所述,这个正则表达式用来匹配一个不包含空格、不包含汉字、同时包含数字、小写字母和大写字母的字符串

详细可以看我的文章: https://segmentfault.com/a/1190000043513389

  • /^.............$/, 两边的符号同时出现表示精确匹配
  • ()表示分组, 分组有组号, 里面的 ?! 就是非捕获分组,正向肯定预查, 此时是不占用组号的
  • 每个()删除?!后比如 (^\d+$) 里面的^.............$表示精确匹配 \d 表示匹配数组, + 表示该数字出现一次或多次, (^\d+$)就是指匹配12131这样的
  • (?!^[a-z]+$) 核心是[a-z]+, [a-z] 表示a-z, 小写字母, 整体匹配 safas这样的
  • (?!^[A-Z]+$) 表示大写 FHFHFHKK
  • (?!^1+$) 核心是1+, ^ 表示以...开头, 整体就是 9asdf ass233, 这种是以数字或小写字母开头的
  • (?!^2+$) 以数字或大写字母开头的
  • (?!^.[\u4E00-\u9FA5].$) .* 就是单个字符匹配任意次,即贪婪匹配, 我文章也有写, \u4E00 与 \u9FA5 中文的unicode码, 用于匹配中文
  • 最后的 \S 表示非空字符, 就是不能是空格, tab等, * 是重复零次或更多次
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

  1. a-z0-9
  2. A-Z0-9
推荐问题
logo
Microsoft
子站问答
访问
宣传栏