JS-正则表达式-程序员宅基地

技术标签: 正则表达式  

目录

1.什么是正则表达式

2.正则表达式创建

3.字符分类

普通字符

特殊字符

模式修饰符

4.正则表达式实例方法

  (1)exec

    [匹配的内容,index: 在str中匹配的起始位置,input: 参数字符串,groups: undefined]

    否则返回null

    (2)test

    (3)toString/toLocaleString、valueOf

5.正则表达式实例属性

  (1)lastIndex

  (2)ignoreCase、global、multiline、source

6.正则表达式语法-元字符

  (1)直接量字符

   (2)字符集合(可以使用连字符‘-’指定一个范围 )

    (3)边界符

    (4)字符集合与“^”和“$”一起使用

     (5)零宽和非零宽单词边界

    (6)字符类

7.数量词

案例

(1)匹配QQ号:不能以数字0开始,只能由数字组成,长度为5-11位

(2)匹配身份证号:不能以数字0开头,只能由数字组成,最后一位可能是x,X,数字

 重复方式

(1)贪婪模式

(2)非贪婪模式

8.选择,分组,引用

(1)选择

(2)分组

      匹配'briupbriupbriup'

      候选

     捕获与引用

     嵌套分组的捕获

(3)引用

9.String对正则表达式的支持

  (1)search

  (2)match

10.前瞻表达式

案例:

1.验证是否为11位有效手机号码?

2.密码验证


正则表达式:正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

1.什么是正则表达式

正则表达式是由一个字符序列形成的搜索模式。

当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

正则表达式可以是一个简单的字符,或一个更复杂的模式。

正则表达式可用于所有文本搜索和文本替换的操作。

2.正则表达式创建

/**
 * 正则表达式创建
 * 1.构造函数创建new RegExp('正则表达式','修饰符')
 * 2.直接字面量/正则表达式/修饰符
 */
var str = 'Hello wrold javascript hello';
var reg = new RegExp('hello','igm');
var reg1 = /hello/igm;

3.字符分类

普通字符

       字母、数字、下划线、汉字、没有特殊含义的符号(,;!@等)

  实际上不是特殊字符的字符都是普通字符

特殊字符

  \:将特殊字符转义成普通字符

模式修饰符

  i:ignoreCase,匹配时忽视大小写

  m:multiline,多行匹配

  g:global,全局匹配

  字面量创建正则时,模式修饰符写在一对反斜线后

4.正则表达式实例方法

  (1)exec

    如果匹配到,返回值是一个result数组:

    [匹配的内容,index: 在str中匹配的起始位置,input: 参数字符串,groups: undefined]
    否则返回null

注意点:

(1)如果正则表达式中有修饰符"g",这时,在正则表达式的实例reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行exec的时候,从lastIndex开始检索。

(2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索

var str = 'Hello wrold javascript hello';
var reg = new RegExp('hello','igm');
var reg1 = /hello/igm;

/**
 * 正则表达式实例方法 RegExprototype.exec 
 * 参数:要匹配字符串 返回值:数组或者null 匹配到返回一个数组 
 * [
		'Hello',
		index: 0,
		input: 'Hello wrold javascript hello',
		groups: undefined]
 * */
 console.log(reg.exec(str));
 console.log(reg.exec(str));
 console.log(reg.exec(str));
// console.log(res[0],res['index'],res.input)
运行结果:
[
  'Hello',
  index: 0,
  input: 'Hello wrold javascript hello',
  groups: undefined
]
[
  'hello',
  index: 23,
  input: 'Hello wrold javascript hello',
  groups: undefined
]
null
------------------------------------------------------------------
// 想要全局匹配字符 
while(true){
	var res = reg.exec(str);
	if(!res){
		break;
	} 
	console.log(res[0],res.index)
}
运行结果:
Hello 0
hello 23

    (2)test

      用来测试待检测的字符串中是否有可以匹配到正则表达式的字符串,如果有返回true,否则返回false

注意点

 (1)如果正则表达式中有修饰符"g",这时,在reg中会维护lastIndex属性,记录下一次开始的位置,当第二次执行test的时候,从lastIndex开始检索。

 (2)如果正则表达式中没有修饰符"g",不会维护lastIndex属性,每次执行从开始位置检索

var reg = /hello/;
var str = 'hello world';
/**
 * 校验字符串匹配到正则表达式 test 
 * 参数:要匹配正则表达式得字符串 返回值:true false
 */
console.log(reg.test(str));//true

    (3)toString/toLocaleString、valueOf

      toString/toLocaleString------把正则表达式的内容转化成字面量形式字符串/有本地特色的字符串(JS中没效果

      valueOf-------返回正则表达式本身

var reg = /hello/;
var str = 'hello world';

/**
 * toString  toLocaleString 转为本地特色字符串
 * valueOf 返回正则表达式本身
 */
console.log(reg.toString(),typeof (reg.toString()));///hello/ string
console.log(reg.toLocaleString(),typeof (reg.toLocaleString()));///hello/ string
console.log(reg.valueOf(),typeof (reg.valueOf()));///hello/ object
console.log(reg,typeof reg);///hello/ object

5.正则表达式实例属性

  (1)lastIndex

当没设置全局匹配时,该属性值始终为0

设置了全局匹配时,每执行一次exec/test来匹配,lastIndex就会移向匹配到的字符串的下一个位置,当指向的位置后没有可以再次匹配的字符串时,下一次执行exec返回null,test执行返回false,然后lastIndex归零,从字符串的开头重新匹配一轮

每次正则查找的起点就是lastIndex

var reg = /hello/g;//g开启全局匹配
var str = 'hello hello hello';
// 没开启全局匹配的结果
// console.log(reg.lastIndex);//0
// console.log(reg.exec(str));//[]
// console.log(reg.lastIndex);//0

console.log(reg.lastIndex);
console.log(reg.exec(str));
console.log(reg.lastIndex);

console.log(reg.exec(str));
console.log(reg.lastIndex);

console.log(reg.exec(str));
console.log(reg.lastIndex);


console.log(reg.exec(str));
console.log(reg.lastIndex);

console.log(reg.exec(str));
console.log(reg.lastIndex);

运行结果:
0
[ 'hello', index: 0, input: 'hello hello hello', groups: undefined ]
5
[ 'hello', index: 6, input: 'hello hello hello', groups: undefined ]
11
[ 'hello', index: 12, input: 'hello hello hello', groups: undefined ]        
17
null
0
[ 'hello', index: 0, input: 'hello hello hello', groups: undefined ]
5

  (2)ignoreCase、global、multiline、source

  ignoreCase、global、multiline:判断正则表达式中是否有忽略大小写、全局匹配、多行匹配三个模式修饰符

  source:返回字面量形式的正则表达式(类似于toString

/**
 * 正则表达式实例属性 
 * ignoreCase global multilinem  返回值 就是true false
 * source
 */
var str = 'hello hello hello';
var pattern = /hello/igm;
console.log(pattern.ignoreCase);//true
console.log(pattern.global);//true
console.log(pattern.multiline);//true
console.log(pattern.source,typeof (pattern.source));//hello string

6.正则表达式语法-元字符

  (1)直接量字符

var reg = /\n/;
console.log(reg.test('hello  world'));
console.log('hello \n world');
运行结果:
false
hello 
 world

   (2)字符集合(可以使用连字符‘-’指定一个范围

[abc] 查找方括号之间的任何字符

[0-9] 查找任何从0至9的数字

[^xyz] 一个反义或补充字符集,也叫反义字符组。也就是说,它匹配任意不在括号内的字符。你也可以通过使用连字符 '-' 指定一个范围内的字符。

/**
 * 字符集合 [abc0-9] [^xyz]
 *  */ 
 var reg1 = /[abc]/;
 var reg2 = /[0-9]/;
 var reg3 = /[^xyz]/;
 var str1 = 'aaa hello world1';
 var str2 = 'xyz';
 console.log(reg1.test(str1));//true
 console.log(reg2.test(str1));//true
 console.log(reg3.test(str1));//true
 console.log(reg1.test(str2));//false
 console.log(reg2.test(str2));//false
 console.log(reg3.test(str2));//false

    (3)边界符

^    匹配输入开始。表示匹配行首的文本(以谁开始)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符后的开始处。

$    匹配输入结尾。表示匹配行尾的文本(以谁结束)。如果多行(multiline)标志被设为 true,该字符也会匹配一个断行(line break)符的前的结尾处。

如果 ^和 $ 在一起,表示必须是精确匹配

/**
 * 边界符 ^ 以什么开头 $ 以什么结尾
 */
 var reg = /abc/;
 console.log(reg.test('abc'));//true
 console.log(reg.test('aabc'));//true
 console.log(reg.test('aabcd'));//true
----------------------------------------------------
 var reg = /^abc/;
 console.log(reg.test('abc'));//true
 console.log(reg.test('aabcd'));//false
 console.log(reg.test('abcd'));//true 
----------------------------------------------------
 var reg = /abc$/;
 console.log(reg.test('abc'));//true
 console.log(reg.test('aabc'));//true
 console.log(reg.test('abcd'));//false
----------------------------------------------------
// 精准匹配 
 var reg = /^abc$/;
 console.log(reg.test('abc'));//true
 console.log(reg.test('abcabc'));//false
 console.log(reg.test('aabc'));//flase
 console.log(reg.test('abcd'));//false

    (4)字符集合与“^”和“$”一起使用

// 三选一 只有是a 或者是 b  或者是c 这三个字母才返回 true
var reg = /^[abc]$/;
console.log(reg.test('a'));//true
console.log(reg.test('b'));//true
console.log(reg.test('c'));//true
console.log(reg.test('aa'));//false
console.log(rg1.test('abc'));//false
----------------------------------------------------
//26个英文字母任何一个字母返回 true  - 表示的是a 到z 的范围  
var reg = /^[a-z]$/ 
console.log(reg.test('a'));//true
console.log(reg.test('z'));//true
console.log(reg.test('A'));//false
----------------------------------------------------
var reg = /^[0-9A-Za-z]$/;
console.log(reg.test('a'));//true
console.log(reg.test('A'));//true
console.log(reg.test('2'));//true
console.log(reg.test('!'));//false
----------------------------------------------------
//取反 方括号内部加上 ^ 表示取反,只要包含方括号内的字符,都返回 false 。
var reg = /^[^0-9A-Za-z]$/;
console.log(reg.test('a'));//false
console.log(reg.test('A'));//false
console.log(reg.test('2'));//false
console.log(reg.test('!'));//true

     (5)零宽和非零宽单词边界

\b 匹配一个零宽单词边界(zero-width word boundary),表示一个单词(而非字符)边界,也就是单词和空格之间的位置,或者字符(\w)与字符串开头或者结尾之间的位置。

\B 匹配一个零宽非单词边界(zero-width non-word boundary),与"\b"相反。

/**
 * \b 零宽单词边界 单词和空格之间位置 
 * \B 单词边界和单词边界中间得位置 不匹配单词边界
 */
var str = 'hello world javasript';

var reg = /\Borl\B/;
console.log(reg.exec(str));
运行结果:
[ 'orl', index: 7, input: 'hello world javasript', groups: undefined ]
-------------------------------------------------------------------------------
var reg = /\bworld\b/;
console.log(reg.exec(str));
运行结果:
[
  'world',
  index: 6,
  input: 'hello world javasript',
  groups: undefined
]

    (6)字符类

var str1 = '\nhello\r world js';
var str2 = '\n\r';
//匹配除换行符\n回车符\r之外得任意字符 
var reg = /./;
console.log(reg.test(str1));//true
console.log(reg.test(str2));//false
------------------------------------------------------------
/**
 * \d 等同于[0-9] 匹配任意数字 
 * \D 等同于[^0-9] 不匹配数字
 */
var reg = /\d/;
console.log(reg.test('12'));//true
console.log(reg.test('0'));//true
console.log(reg.test('a'));//false

var reg = /\D/;//匹配任意字符除数字 [^0-9]
console.log(reg.test('1'));//false
console.log(reg.test('a'));//true
console.log(reg.test('!'));//true
console.log(reg.test(' '));//true
--------------------------------------------------------------
/**
 * \w 匹配[0-9A-Za-z_] 
 * \W 匹配[^0-9A-Za-z_]
 */
var reg = /\w/;
console.log(reg.test('a'));//true
console.log(reg.test('A'));//true
console.log(reg.test('_'));//true
console.log(reg.test('1'));//true
console.log(reg.test('!'));//false
console.log(reg.test(' '));//false

var reg = /\W/;//[^0-9A-Za-z_]
console.log(reg.test('0'));//false
console.log(reg.test('a'));//false
console.log(reg.test('A'));//false
console.log(reg.test('_'));//fasle
console.log(reg.test('@'));//true
console.log(reg.test(' '));//true
--------------------------------------------------------
/**
 * \s 匹配任何unicode空白符 空格 制表符 换行符 [\f\n\t\r]
 * \S 匹配除以上字符之外得任意字符 [^\f\n\t\r]
 */
var reg = /\s/;
console.log(reg.test(' '));//true
console.log(reg.test('\n'));//true
console.log(reg.test('a'));//false
console.log(reg.test('1'));//false

var reg = /\S/;
console.log(reg.test('1'));//true
console.log(reg.test('a'));//true
console.log(reg.test('!'));//true
console.log(reg.test(' '));//false
console.log(reg.test('\n'));//false

7.数量词

/**
 * 1.* 匹配字符>=0次 
 * 2.+ 匹配字符>=1次
 * 3.? 匹配字符0次 1次 
 * 4.{n} 匹配字符 n次
 * 5.{n,} 匹配字符>=n次 
 * 6.{n,m} 匹配字符n到m次 n=<字符<=m
 */
var reg = /^a*$/;
console.log(reg.test(""));//true
console.log(reg.test("a"));//true
console.log(reg.test("aa"));//true
-----------------------------------------------------
var reg = /^a+$/;
console.log(reg.test(''));//false
console.log(reg.test('a'));//true
console.log(reg.test('aaa'));//true
-----------------------------------------------------
var reg = /^a?$/; // 0次或者1次 
console.log(reg.test(''));//true
console.log(reg.test('a'));//true
console.log(reg.test('aa'));//false
console.log(reg.test('aaa'));//false
-----------------------------------------------------
var reg = /^a{3}$/;//匹配a字符3次
console.log(reg.test('aaa'));//true
console.log(reg.test('aaaa'));//false
console.log(reg.test('aa'));//false
-----------------------------------------------------
var reg = /^a{3,6}$/;//匹配a字符3-6次
console.log(reg.test('aa'));//false
console.log(reg.test('aaa'));//true
console.log(reg.test('aaaa'));//true
console.log(reg.test('aaaaa'));//true
console.log(reg.test('aaaaaa'));//true
console.log(reg.test('aaaaaaa'));//false
-----------------------------------------------------
var reg = /^a{3,}$/;//匹配a字符>=3次
console.log(reg.test('aaa'));//true
console.log(reg.test('aaaa'));//true
console.log(reg.test('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'));//true
console.log(reg.test('aa'));//false

案例

(1)匹配QQ号不能以数字0开始,只能由数字组成,长度为5-11位
var reg = /^[1-9]\d{4,10}$/;
console.log(reg.test('1112'));//false
console.log(reg.test('26810'));//true
console.log(reg.test('26810222222'));//true
console.log(reg.test('268102222222'));//false
(2)匹配身份证号:不能以数字0开头,只能由数字组成,最后一位可能是x,X,数字
var reg = /^[1-9]\d{16}[xX\d]$/;
console.log(reg.test('14232520230628111x'));//true
console.log(reg.test('14232520230628111a'));//false
console.log(reg.test('1423252023062811'));//false
console.log(reg.test('14232520230628112'));//false

 重复方式

(1)贪婪模式

尽可能多的匹配(首先取最多可匹配的数量为一组进行匹配),当匹配剩余的字符串,还会继续尝试新的匹配,直到匹配不到为止,为默认模式。

/**
 * 贪婪模式 默认模式 尽可能多的匹配字符 剩下得字符符合数量词继续匹配 
 * 不符合直接返回null 
 */
 var reg = /\d{3,6}/g;
 var str = '12345678910';
 console.log(reg.exec(str));
 console.log(reg.exec(str));
 console.log(reg.exec(str));
运行结果:
[ '123456', index: 0, input: '12345678910', groups: undefined ]
[ '78910', index: 6, input: '12345678910', groups: undefined ]
null
(2)非贪婪模式

尽可能少的匹配(每次取最少匹配的数量为一组进行匹配),直到匹配不到为止 使用方法:在量词后加上

/**
 * 非贪婪模式 尽可能少的匹配 当剩余字符串符合数量词最少匹配次数继续匹配 
 * 不合符直接返回null
 */
var reg = /\d{3,6}?/g;
var str = '12345678';
console.log(reg.exec(str));
console.log(reg.exec(str));
console.log(reg.exec(str));
运行结果:
[ '123', index: 0, input: '12345678', groups: undefined ]
[ '456', index: 3, input: '12345678', groups: undefined ]
null

8.选择,分组,引用

(1)选择

        字符"|"用于分隔供选择的字符,选择项的尝试匹配次序是从左到右,直到发现了匹配项,如果左边的选择项匹配,就忽略右边的匹配项,即使它可以产生更好的匹配。

/**
 * 选择 |  html|css|js 从左到右依次匹配字符串  匹配到左侧就直接返回左侧 
 * 开启全局匹配 继续校验就会向右匹配
 */
var reg = /html|css|js/g;
var str = 'hellowroldcsshtml';
console.log(reg.exec(str));
console.log(reg.exec(str));
运行结果:
[ 'css', index: 10, input: 'hellowroldcsshtml', groups: undefined ]
[ 'html', index: 13, input: 'hellowroldcsshtml', groups: undefined ]

(2)分组

      匹配'briupbriupbriup'
/**
 * 分组 () briupbriupbriup 
 */
var reg = /^briupbriupbriup$/;
console.log(reg.test('briup'));//false
console.log(reg.test('briupbriup'));//false
console.log(reg.test('briupbriupbriup'));//true
console.log(reg.test('briupbriupbriupbriup'));//false

var reg = /^(briup){3}$/;
console.log(reg.test('briup'));//false
console.log(reg.test('briupbriup'));//false
console.log(reg.test('briupbriupbriup'));//true
console.log(reg.test('briupbriupbriupbriup'));//false
      候选

一个分组中,可以有多个候选表达式,用 | 分隔:

/**
 * 候选 选择分组综合
 */
var reg = /I Like (html|css|js)/;
console.log(reg.test('I Like html'));//true
console.log(reg.test('I Like css'));//true
console.log(reg.test('I Like js'));//true
console.log(reg.test('I Like table'));//false
     捕获与引用

被正则表达式匹配(捕获)到的字符串会被暂存起来。其中,由分组捕获的串会从1开始编号,于是我们可以引用这些串:

/**
 * 匹配到字符串(捕捉 缓存)起来  在引用之前需要校验字符串
 */
var reg = /(\d{4})-(\d{2})-(\d{2})/;
var str = '2023-06-28';
reg.exec(str);
// console.log(reg.exec(str));
// 引用
console.log(RegExp.$1);//引用第一次捕捉到得结果2023
console.log(RegExp.$2);//引用第二次捕捉到得结果06
console.log(RegExp.$3);//引用第三次捕捉到得结果28
     嵌套分组的捕获
var reg = /((apple) is (a (fruit)))/
var str = "apple is a fruit"
reg.test(str) // true
RegExp.$1 // apple is a fruit
RegExp.$2 // apple
RegExp.$3 // a fruit
RegExp.$4 // fruit

(3)引用

正则表达式里也能进行引用,这称为反向引用

//\1引用了第一个被分组所捕获的串,表达式是动态决定的
var reg = /(\w{3}) is \1/
console.log(reg.test('kid is kid')); // true
console.log(reg.test('dik is dik')); // true
console.log(reg.test('kid is dik')); // false
console.log(reg.test('dik is kid')); // false
------------------------------------------------------
//如果编号越界了,会被当成普通的表达式
var reg = /(\w{3}) is \6/;
reg.test( 'kid is kid' ); // false
reg.test( 'kid is \6' );  // true

9.String对正则表达式的支持

  (1)search

查找字符串中是否有匹配正则的字符串,有则返回字符串第一次出现时的位置,无则返回null

正则中无论是否有全局匹配都不会影响返回结果

/**
 * search   obj.sayName()  arr.pop() fn.call() 
 * 
 */
var reg = /hello/g;
var str = 'hello wrold hello';
console.log(str.search(reg));//0
console.log(str.search(reg));//0

  (2)match

匹配字符串中符合正则表达式的字符串,并返回该字符串的一个数组,其中包括字符串内容位置

如果正则设置全局匹配,则一次性返回所有符合正则表达式的字符串数组

如果其中添加了分组,返回符合要求的字符串以及分组的一个数组,但如果同时开启全局匹配则不会在数组中添加分组内容

/**
 * match 字符串匹配符合正则表达式字符 匹配到返回第一次匹配到数组
 * ['hello',index:0,input:"hello world hello",groups:undefiend]
 * 如果开启全局匹配 会被所有符合正则得字符全部放到一个数组中
 * [ 'hello', 'hello' ]
 */
var str = 'hello world hello';
var reg = /hello/;//['hello',index:0,input:"hello world hello",groups:undefiend]
var reg = /hello/g;//[ 'hello', 'hello' ]
console.log(str.match(reg));
var reg = /(he)llo/;//['hello','he',index: 0,input: 'hello world hello',groups: undefined]
var reg = /(he)llo/g;//[ 'hello', 'hello' ]
console.log(str.match(reg));

  (3)split

以某种形式分割字符串将其转换为数组

/**
 * split 以某种形式分割字符串将其转换为数组
 */
var str = 'terry123larry456tony';
var reg = /\d{3}/;
console.log(str.split(reg));//[ 'terry', 'larry', 'tony' ]

  (4)replace:满足正则表达式得内容会被替换

/**
 * replace 满足正则表达式得内容会被替换
 */
var str = 'javascript';
var reg = /javascript/;
var res = str.replace(reg,'java');
console.log(res,str,reg);//java javascript /javascript/

10.前瞻表达式

在正则表达式当中有个东西叫做前瞻,有的管它叫零宽断言:

 正向前瞻

正向前瞻的作用,同样是字符"H",但是只匹配"H"后面紧跟"i"的"H"。就相当于有一家公司reg,这时候有多名"H"人员前来应聘,但是reg公司提出了一个硬条件是必须掌握"i"这项技能,所以"Hello"就自然的被淘汰掉了。

var str = 'Hello, Hi, I am Hilary.';
// 后面一定要匹配什么
var reg = /H(?=i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Hello, Ti, I am Tilary.

负向前瞻

匹配"H",且后面不能跟着一个"i"。这时候"Hello"就可以成功的应聘了,因为reg公司修改了他们的招聘条件,他们说"i"这门技术会有损公司的企业文化,所以我们不要了。

var str = 'Hello, Hi, I am Hilary.';
// 后面一定不要匹配什么
var reg = /H(?!i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Tello, Hi, I am Hilary.
----------------------------------------------------
var str = 'Hello, Hi, I am Hilary.';
// 后面一定不要匹配什么
var reg = /(?!i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//THTeTlTlToT,T THiT,T TIT TaTmT THiTlTaTrTyT.T

案例:

1.验证是否为11位有效手机号码?

以1为开头, 第二位为3,4,5,7,8中的任意一位, 最后以0-9的9个整数结尾

// 1.验证是否为11位有效手机号码?
// - 以1为开头
// - 第二位为3,4,5,7,8中的任意一位
// - 最后以0-9的9个整数结尾
var reg = /^1[34578]\d{9}$/;
var str = '13858285646';
console.log(reg.test(str));//true
2.密码验证

匹配密码,必须包含大写,小写和数字,和特殊字符(!,@,#,%,&),且大于6位

// 2.密码验证
// 匹配密码,必须包含大写,小写和数字,和特殊字符(!,@,#,%,&),且大于6位
/**
 * 分析: [A-Z] [a-z] \d [!@#%&]{6,}
 * 出现顺序:不确定 (?=.*[A-Z]); 表示前面有可能有内容 也有可能没有内容
 * ^[A-Za-z\d!@#%&]
 */
var reg = /(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#%&])^[A-Za-z\d!@#%&]{6,}$/;
var str = '1!1A3a';
console.log(reg.test(str));

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_57993363/article/details/131432543

智能推荐

【论文阅读】【三维目标检测】在Range view上做3D目标检测_rangeview-程序员宅基地

文章浏览阅读3.3k次,点赞10次,收藏22次。文章目录BEV or Range ViewRangeDet: In Defense of Range View for LiDAR-based 3D Object DetectionRange Conditioned Pyramid InMeta-Kernel ConvolutionWeighted Non-Maximum SuppressionData Augmentation in Range View DataExperimentrange view是仅针对物理旋转式扫描的激光雷达的特殊view,例_rangeview

shell 实现并发,并控制并发数量_shell 并发-程序员宅基地

文章浏览阅读4k次,点赞4次,收藏26次。为了方便理解,一步步的来首先先看一下串行的:#! /bin/bashST=$(date +%s)for i in $(seq 1 10)do echo $i sleep 1 # 模拟程序、命令doneET=$(date +%s)TIME=$(( ${ET} - ${ST} ))echo "time: ${TIME}"输出结果:12345678910time: 10这就最原始的进程运行模拟,串行方式,无法有效利用计算机的资源,_shell 并发

Mybatis-puls自动分页Page无法分页解决_使用mybatis-plus中page进行分页不生效-程序员宅基地

文章浏览阅读3.3k次,点赞3次,收藏5次。一开始使用Page时发现数据能出来但是无法分页,只能全部显示。打印数据出来也显示0。最后查了许多资料发现这个插件需要一个工具类的支持才可以实现。检查了一下代码发现也没有问题。最后更改完成测试,好使了。_使用mybatis-plus中page进行分页不生效

dpi与dp的关系_px、dp、sp、dpi之间的区别和转换-程序员宅基地

文章浏览阅读2k次。px、dp、sp、dpi之间的区别和转换区别:px (pixels)像素 -- 是像素,就是屏幕上实际的像素点单位。(一般UI人员在ps中经常使用)dp/dip 设备独立像素,android layout经常使用的尺寸单位,与设备屏幕有关,dp是虚拟像素,在不同的像素密度的设备上会自动适配。即与像素密度无关。sp 放大像素,主要是处理字体的大小dpi:Android支持四种不同的dpi模式:ldp..._dpi dp

2021-1-31: c语言中 %f 和 %lf 的区别_%if-程序员宅基地

文章浏览阅读3.4k次,点赞7次,收藏14次。%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。其中:float,单精度浮点型,对应%f。double,双精度浮点型,对应%lf。在用于输出时:float类型可以使用%lf格式,但不会有任何好处。double类型如果使用了%f格式可能会导致输出错误。在用于输入时:double 类型使用了%f格式,会导致输入值错误。float类型使用double类型不仅会导致输入错误,还可能引起程序崩溃。所以在输入输出时,一定要区分好double和float,而使用对_%if

IDEA 使用Git图文详解_git idea-程序员宅基地

文章浏览阅读10w+次,点赞325次,收藏1.6k次。一、配置git路劲:或二、克隆项目或填写克隆路径及输出路径三、上传项目到git仓库 1、在你的idea里新建git仓库,这是新建本地仓库,等会会同步到线上git仓库 2、新建后如果文件名不是绿色的表示没有加入到git索引中 3、将需要上传的文件按照下图方式add 4、添加后,相应的文件名会变成绿色 5、然后commit项目,提交项目,这里是先提交带本地仓库 6、然后push到线上仓..._git idea

随便推点

使用JavaScript制作动态网页-2_javascript实现同个窗口的动态网页-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏15次。使用JavaScript制作动态网页-2表单验证<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>表单验证</title></head><body> <form action="..._javascript实现同个窗口的动态网页

Ubuntu20.04解决应用中心打不开的问题_snap商店打不开-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏76次。Ubuntu20.04软件中心打不开 尝试了很多方法 Ubuntu 20.04 默认把软件中心换成了 snap, 感觉 snap 应用老出状况, snap 应用不但体积大, 安装好的应用还不时就崩溃, 所以如果要把电脑里的所有 snap 应用全部替换了, snapd 也卸载了. 下面这三句可以有效的解决 sudo apt install ubuntu-software sudo sn..._snap商店打不开

C语言-数据结构-栈-实验报告_数据结构栈的应用实验报告-程序员宅基地

文章浏览阅读6.5k次,点赞8次,收藏70次。实验报告内容:一、实验目的、要求:(1)熟练掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。(2)编写适当的主函数和相关函数,使实验题目运行出正确结果。(3)当场编程、调试、编译。(4)程序具有一定的健壮性、可读性,尽量简洁。(5)程序运行完成后分别存盘,上交实验报告,要求写出实验体会二、实验内容:(1)实验题目(2)主要函数的算法设计思想(3)程序清单(3)测试数据、实验结果及结论(4)实验体会(实验中存在的_数据结构栈的应用实验报告

qRadioButton-程序员宅基地

文章浏览阅读384次。#ifndef TESTRADIOBUTTON_H#define TESTRADIOBUTTON_H#include #include "ui_testradiobutton.h"class testRadioButton : public QMainWindow{ Q_OBJECTpublic: testRadioButton(QWidget *paren_radiobutton

C# WinForm 封装自定义组件(控件)Dll_把winfrom用户自定义控件封装成dll-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏22次。封装自定义控件很简单,没什么技术含量,这里通过封装自定义的数字文本框实例简单总结一下:【1】新建自定义控件库 -- Windows Forms Control Library【2】添加自定义组件 -- Component Class【3】继承TextBox,添加KeyPress事件,代码如下:using System;usi_把winfrom用户自定义控件封装成dll

mysql关闭slave_mysql 关闭slave-程序员宅基地

文章浏览阅读619次。mysql版本:5.6.14一、修改 my.cnf 文件,增加skip-slave-start参数即可[mysqld]#主从log-bin=mysql-binserver-id=148skip-slave-start二、重启mysql/etc/init.d/mysql restart三、验证slave是否启动mysql> SHOW SLAVE STATUS\G****************..._mysql disable slave