如何判断一个字符串符合特定的格式,或者抓取符合规则的字符串片段?
JS正则表达式写法 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
总之,你可以用正则表达式规定一种格式,检测字符串 是不是符合这个格式。
1 2 3 4 5 6 7 let reg = /abc/ let reg = new RegExp ("abc" );reg.test ("字符串" )
一个输入校验的小案例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Document</title > </head > <body > <form action ="" > <input type ="text" required id ="mytext" > <input type ="submit" value ="submit" > </form > <script > let reg = /abc/ ; mytext.onblur =function ( ){ console .log (mytext.value ); console .log (reg.test (mytext.value )); } </script > </body > </html >
元字符 正则表达式中一种特殊的字符,类似转义字符,能够表达一种类型的数据。
基本元字符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 let reg = /\d/ ; console .log (reg.test ("12a3" )); console .log (reg.test ("1" )); console .log (reg.test ("abc" )); let reg = /\D/ console .log (reg.test ("12a3" )); console .log (reg.test ("1" )); console .log (reg.test ("abc" )); let reg = /\s/ console .log (reg.test ("12a 3" )); console .log (reg.test ("1\nbc" )); console .log (reg.test (" abc" )); console .log (reg.test ("abc" )); let reg = /\S/ console .log (reg.test ("" )); console .log (reg.test (" " )); console .log (reg.test ("\n\n" )); console .log (reg.test (" \nb " )); let reg = /\S/ console .log (reg.test ("" )); console .log (reg.test (" " )); console .log (reg.test ("\n\n" )); console .log (reg.test (" \nb " )); let reg = /\w/ console .log (reg.test ("#^&" )); console .log (reg.test (" a " )); console .log (reg.test ("1" )); console .log (reg.test ("_" )); console .log (reg.test (" " )); let reg = /\W/ console .log (reg.test ("#^&" )); console .log (reg.test (" a " )); console .log (reg.test ("1" )); console .log (reg.test ("_" )); console .log (reg.test (" " )); let reg = /./ console .log (reg.test ("#^&" )); console .log (reg.test (" " )); console .log (reg.test ("1_a" )); console .log (reg.test ("_\n" )); console .log (reg.test ("\n\n" ));
只用元字符表示包含 ,只要有,就能通过判断
边界符 边界符用来修饰基本元字符或普通字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let reg = /^\d/ console .log (reg.test ("8skj" )); console .log (reg.test ("a5156" )); console .log (reg.test (" 5a56" )); let reg = /\w$/ console .log (reg.test ("8skj " )); console .log (reg.test ("a5156%#¥" )); console .log (reg.test (" 5a56_" )); let reg = /^abcde$/ console .log (reg.test ("abcde" )); console .log (reg.test ("abcdeabcde" )); console .log (reg.test ("abcdejiolabcde" ));
限定符 限定符用来修饰基本元字符或普通字符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let reg = /\d*/ let reg = /\d+/ let reg = /\d?/ let reg = /\d{6}/ let reg = /\d{5,}/ let reg = /\d{5,8}/
注意,上面的边界符合限定符只能修饰一个字符!
特殊符号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 let reg = /^(abc){2}$/ let reg = /a|b/ let reg = /abc|11568|@qq.com/ let reg = /[abcde]/ let reg = /[abcde]{3,t}/ let reg = /[^abcde]/
exec方法 前面说过reg.test("字符串")
可以判断是否匹配
而reg.exec("字符串")
可以从一段字符串中,将匹配的部分字符串取出返回(返回值为一个数组 )
1 2 3 4 5 6 7 8 9 10 11 12 13 let reg = /\d{4}-\d{1,2}-\d{1,2}/ console .log (reg.exec ("This time is 2077-1-17 12:37:44" )); let reg = /(\d{4})-(\d{1,2})-(\d{1,2})/ console .log (reg.exec ("This time is 2077-1-17 12:37:44" )); 0 : "2077-1-17" 1 : "2077" 2 : "1" 3 : "17"
标识符 全局标识符g,可以让系统记住上次查找到哪个位置了,下一次接着找
1 2 3 4 5 6 let reg = /\d{4}-\d{1,2}-\d{1,2}/g console .log (reg.exec ("This time is 2077-1-17 12:37:44,not 1977-8-18 01:23:44" )); console .log (reg.exec ("This time is 2077-1-17 12:37:44,not 1977-8-18 01:23:44" ));
i标识符,自动忽略大小写
1 2 3 4 let reg = /abc/i console .log (reg.test ("aBcdjf" )); console .log (reg.exec ("AbCdjf" )[0 ]);
正则表达式的两大特性 懒惰性 前面说过,正则默认检索完一次字符串后,第二次从头检索。
解决 :用全局标识符g
贪婪性 当我们正则规定了一个范围后,默认寻找符合的最长的字符串
解决 : 用?进入非贪婪模式,匹配符合的最短字符串
比如
1 2 3 4 let reg=/<p.*?>/ ; console .log (reg.exec ('<p class="active"><span></span></p>' )[0 ]);
正则与字符串方法连用 str.replace(目标字符串,替换内容)
目标字符串处可以用正则表达式
1 2 3 4 5 6 7 let str = 'abbacdako' let newstr = str.replace ("a" ,"$" ); console .log (newstr); let str = 'abbacdako' let newstr = str.replace (/a/g ,"$" ); console .log (newstr);
str.search(目标字符串)
目标字符串可以用正则
1 2 3 4 5 let str = 'abbacdako' console .log (str.search ("ba" )); let str = 'a3ildfjl56ii' console .log (str.search (/\di/ ));
str.match(目标字符串)
目标字符串可以用正则
1 2 3 4 5 let str = 'This time is 2077-1-17 12:37:44,not 1977-8-18 01:23:44' console .log (str.match (/\d{4}-\d{1,2}-\d{1,2}/g )); 0 : "2077-1-17" 1 : "1977-8-18"