js 正则 test exec match replace split search 断言

前言

正则表达式主要用来验证客户端的输入数据。用户填写完表单单击按钮之后,表单就会被发送到服务器,在服务器端通常会用PHP、ASP.NET等服务器脚本对其进行进一步处理。因为客户端验证,可以节约大量的服务器端的系统资源,并且提供更好的用户体验。

正则表达式(regular expression)是一个描述字符模式的对象。ECMAScript的RegExp类表示正则表达式。而string和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。

正则表达式的创建方式

  1. 字面量创建 var re = /a/
  2. 构造函数创建 var re = new RegExp(正则匹配内容,修饰符);

修饰符:

  • i 不区分大小写匹配
  • g 执行全局匹配
  • m 执行多行匹配
var reg=/a/g;  //字面量创建
var reg=new RegExp("a","g");//构造函数创建
console.dir(reg);
// reg.flags  就是修饰符
// reg.source  就是正则匹配内容

打印出的结果如下,其中:

  • reg.flags 是修饰符
  • reg.source 就是正则匹配内容
    正则表达式

正则表达式中的元字符

正则表达式中常用的特殊字符:

符号 含义
^ 匹配的起始位置,^在 [ ] 中表示反义
$ 匹配的结束位置
. 可以任意匹配任意一个字符 ,[ ] 中的 . 是字符 .
匹配前面的字符0次或一次,{0,1};所有的贪婪匹配,后面加个?,就是非贪婪匹配,情景为:当前后有别的内容,需要对中间的内容进行匹配时,先匹配最小的
+ 匹配前面的字符一次或更多次,至少有一次{1, }
* 匹配前面的字符n次,可看作通配符,{0, }
() 群组,将圆括号内的匹配放置到一个组内,$1就是第一个群组,$2就是第二个群组,$3就是第三个群组… ,使用match()时,如果不加全局,则除返回找到的元素外,还返回群组的元素
{n} 匹配前面的字符n次;当n为0时,意味着匹配一个空字符,即”“
{n,} 匹配前面的字符至少n次
{n,m} 匹配前面的字符至少n次,最大允许m次,默认为贪婪匹配 ,先匹配最大的
[ ] [ ] 里面内容可以任意匹配一个字符,可以用0-9 a-z A-Z
[ ^ ] 在[]中第一位使用 ^,表示除了 ^ 后面的字符外都满足; ^ 如果在 [ ] 不是第一位,就表示字符 ^
| 或者,可以用来匹配多个字符或者另外的字符,如果 | 得一端没有内容,则认为匹配空字符
\ 通常用作转义字符

正则表达式中常用的转义字符序列:

字符序列 含义
\d 代表数字 [ 0-9 ]
\D 代表非数字 [ ^0-9 ]
\w 表示任何字母、数字、下划线 [0-9a-zA-Z_]
\W 表示任何非字母、数字、下划线 [^0-9a-zA-Z_]
\s 表示单个空白字符,如空格或制表符
\S 表示单个非空白字符
\b 字边界,主要用来查找英文单词中的正则,一般想查找一个单词内的东西就需要用\b.*\b来包含
\B 非字边界

正则表达式中常用的转义序列:

字符 含义
\n 换行
\r 回车
\b 退格符
\t 水平制表符,Tab键
\\ 反斜杠符
\[ 左中括号
\] 右中括号
\’ 单引号
\.
/[1-31]/ // 表示 1,2,3
/[0-9]/ // 表示 0,1,2,3,4,5,6,7,8,9
/[a-z]/ // 表示 a,b,c,d,e,...z
/[A-Z]/ // 表示 A,B,C,D.....Z
/a[b.c]b/ //[]中的.是字符.
/a[\[\]]b/ //表示a[]b  写在[]里面[]字符必须转义

//表示中间不要f
"abcafcadcaec".match(/a[^f]c/g) //["abc","adc","aec"]
//^如果在[]不是第一位,就表示字符^
"abcafcadcaec".match(/a[f^a]c/g))// ["afc"]

//{0}意味着匹配一个空字符
"aaaaaa".match(/a{0}/g) //["","","","","","",""]

//贪婪匹配  先匹配最大的
"aaaaaaaa".match(/a{2,5}/g)//["aaaaa","aaa"]
"aaaaaabbb".match(/a{0,4}/g)//["aaaa","aa","","","",""]
"caaaaatcbbbbt".match(/c.*t/g)//["caaaaatcbbbbt"]

//非贪婪匹配
"aaaaaaaa".match(/a{2,5}?/g)//["aa","aa","aa","aa"]
"caaaaatcbbbbt".match(/c.*?t/g)// ["caaaaat","cbbbbt"]

//或
"abcd".match(/c|b/)//["b"]
"abcd".match(/[cb]/)//["b"]
"abcdef".match(/a||b/g)//["a","","","","","",""]

//数字1-31的正则
/[1-9]|[12][0-9]|3[01]/

//群组
"18617891076".match(/(\d{3})(\d{4})(\d{4})/)// ["18617891076","186","1789","1076"]
"18617891076".match(/(\d{3})(\d{4})(\d{4})/g)//["18617891076"]

正则表达式对象的方法

  • test() 判断字符串是否满足正则匹配内容,匹配成功返回true,失败返回false
  • exec() 查找字符串中满足正则匹配内容的结果,被找到的值以数组的形式返回出来,这个数组只有一个元素,包括几个属性,分别是群组,索引,字符串自身。如果没有发现匹配,则返回 null。
var reg=/a/g;
console.log(reg.test("abc"));//true
console.log(reg.exec("abaca"));//Array["a"]

exec() 打印出的结果如下 :
exec

常用字符串匹配正则方法

匹配的顺序自左向右,按下标匹配,已经匹配过的,不会再次匹配。如果当前索引的字符不满足第一个条件,会继续往后匹配第二个条件。

  • search() ,返回第一个匹配内容的下标或者 -1
  • split() ,按照正则匹配切割
  • replace() ,按照正则匹配替换内容
  • match(),返回匹配成功的数组或者null

match()

  • 接受一个参数,正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null
  • 如果不加全局,可以达到exec的目的
  • 如果加有全局匹配,就会只返回找到的所有元素数组
  • 如果加有群组,但是不加全局,则除返回找到的元素外,还返回群组的元素
var str="abcadef";
console.log(str.match(/a/));//[a]
console.log(str.match(/a/g));//[a,a]
var str1="<div>内容内容</div>";
console.log(str1.match(/<(\/?.+?)>/g));//["<div>","</div>"]
console.log(str1.match(/<(\/?.+?)>/));//["<div>","div"]

replace()

按照正则表达式匹配内容进行替换,可以替换成相同的也可以替换成不同的。接受两个参数,第一个是匹配项,第二个可以是字符串或是一个函数

var str="abcdeafgh";
//将字符串中所有的a替换成z
console.log(str.replace(/a/g,"z"));//zbcdezfgh

 //str.replace(正则表达式,回调函数(item,index){
   //    return 返回要替换的内容
// })

案例:

1、将第一个a替换成x,后面的a替换成y
2、查找所有匹配正则元素的下标
3、把任何满足正则内容的进行替换
4、把对应字符替换为相对应的内容

//将第一个a替换成x,后面的a替换成y
var str="abcdeafgh";
str=str.replace(/a/g,function(item,index){
   return index===0 ? "x" : "y";
})
console.log(str);//xbcdeyfgh

//查找所有匹配正则元素的下标
var str1="abcdeafgh";
var arr=[];
str1.replace(/a/g,function(item,index){
    arr.push(index);
})
console.log(arr);//[0,5]

//把任何满足正则内容的进行替换
var str2="abcdeafgh";
console.log(str2.replace(/[bdfh]/g,"0"))//;a0c0ea0g0

//把a替换为1,b替换为2,c替换为3
var str3="abcabcadf";
str3=str3.replace(/[abc]/g,function(item){
    switch(item){
        case "a":return "1";
        case "b":return "2";
        case "c":return "3";
    }
});
console.log(str);//1231231df

search()

按照正则表达式查找字符串中的内容,返回优先查找到第一个元素下标,没有匹配项返回-1。

注意:

就算写了全局匹配,search() 也只返回找到的第一个元素的下标。

var str="abcdeafgh";
console.log(str.search(/a/g));//0
//虽然写了全局匹配,但是search只返回找到的第一个元素的下标。

split()

按照正则表达式匹配内容切割字符串,返回切割后的数组。
可以按照固定的字符进行切割,也可以按照多个字符进行切割。

var str="abcdeafgh";
//以字符"b"对字符串进行切割
console.log(str.split("b"));//["a","cdeafgh"]
//以字符"c"或者"f"对字符串进行切割
console.log(str.split(/[cf]/));//["ab","dea","gh"]

断言

断言只是条件,本身并不会匹配,能帮助你找到符合条件的字符串。

  • ?= 后置条件 向后断言,例:(?=a) 仅当表达式 a 在 此位置的右侧(后面)匹配时才继续匹配。
  • ?! 向后断言,不等于,例:(?!a) 仅当表达式 a 不在 此位置的右侧(后面)匹配时才继续匹配
  • ?<= 前置条件 向前断言,例:(?<=a) 仅当表达式 a 在 此位置的左侧(前面)匹配时才继续匹配。
  • ?<! 前置条件不等于,例:(?<!a) 仅当表达式 a 在 此位置的左侧(前面)匹配时才继续匹配。
//找到后面是d的a
"abcdadef".match(/a(?=d)/g)
//将后面是字母或者数字的a替换成1
"a0bcd adef a&cd".replace(/a(?=[a-z])|a(?=[0-9])/g,"1")

//将后面不是字母的a替换成1
"a0bc adef a&bc".replace(/a(?![a-z])/g,"1")

//将前面是数字的b替换成1
"a0bc adef a&bc".replace(/(?<=[0-9])b/g,"1")

//将前面不是数字的b替换成1
"a0bc adef a&bc".replace(/(?<![0-9])b/g,"1")

//必须包含字母数字的正则
"abacd234".match(/^(?=.*[a-z])(?=.*[0-9])\w+$/)

中文匹配:
/[\u4e00-\u9fd5]+/g)

"你好".match(/[\u4e00-\u9fd5]+/g)

案例:密码等级

低级:纯数字或者纯字母(大小写)密码(6-18)

中级:数字和字母(6-18)

高级:数字字母下划线,符号,空格,!@#¥%^&等(6-18)

/^(\d{8,16}|[a-z]{8,16}|[A-Z]{8,16})$/ //初级
/^([0-9a-zA-Z]{8,16})$/  //中级
/^([\w!@#\$%\^&\*]{8,16})$/  // 高级
发布了46 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Charissa2017/article/details/103892886