学了js之后,在写表单验证的时候,了解到了正则表达式,但是不知道怎么用,就学习了一下,大概整理成这样,供大家参考
何为正则表达式
正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。
创建正则表达式
//字面量方式,其由包含在斜杠之间的模式组成,如下所示:
let re = /ab+c/;
//构造函数方式,调用RegExp对象的构造函数,如下所示:
let re = new RegExp("ab+c");
正则表达式常用方法
test(字符串)
测试字符是否满足正则表达式规则,如果测试到有,则返回true;没有则返回flase。 语法:正则表达式.test(字符串) 正则表达式提供的方法
let reg=/[123]/
let str='1'
let result=reg.test(str)
console.log(result)//flase
search(正则表达式)
search() 方法执行正则表达式和 String 对象之间的一个搜索匹配。 语法:字符串.search(正则表达式) 字符串提供的方法
let reg=/\d/ //匹配阿拉伯数字
let str="abcdefg3sgbh"
let res=str.search(reg)
console.log(res) //7
//验证方法 找到返回下标 找不到返回-1
//在字符串中找到满足正则表达式的那一部分
exec(字符串)
exec() 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null。
语法:正则表达式.exec(字符串)正则表达式提供的方法
let reg=/\d/
let str="abcd456efg"
let res=reg.exec(str)
console.log(res)//返回一个数组,内容是4
//字符串中满足正则表达式的部分提取出来
//遇到满足条件的就返回,所以只返回4
match(正则表达式)
match() 方法检索返回一个字符串匹配正则表达式的结果。
语法:字符串.match(正则表达式) 字符串提供的方法
let reg=/\d/
let str="abcd456efg"
let res=str.match(reg) //字符串中满足表达式的部分提取出来
console.log(res)
replace(正则表达式,新的内容)
replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern是字符串,则仅替换第一个匹配项。
语法:字符串.replace(正则表达式,新的内容)字符串提供的方法
let reg=/\d/
let str="11123bcd"
let res=str.replace(reg,"a") //将数字换为a
console.log(res)//a1123bcd 只要匹配到符合规则的就返回
正则表达式的两种模糊匹配
1.1 横向模糊匹配
横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。其实现的方式是使用量词。譬如{m,n},表示连续出现最少m次,最多n次。
比如/ab{2,5}c/表示匹配这样一个字符串:第一个字符是“a”,接下来是2到5个“b”,最后是字符“c”。
1.1.1 横向常见的简写形式
{m,} 表示至少出现m次。
{m} 等价于{m,m},表示出现m次。
? 等价于{0,1},表示出现或者不出现。
+ 等价于{1,},表示出现至少一次。
* 等价于{0,},表示出现任意次,有可能不出现。
1.1.2贪婪匹配和惰性匹配
默认的匹配是贪婪匹配,例如正则/\d{2,5}/,表示数字连续出现2到5次。会匹配2位、3位、4位、5位连续数字。但是其是贪婪的,在使用它会尽可能多的匹配。
而惰性匹配,就是尽可能少的匹配,例如/\d{2,5}?/表示,虽然2到5次都行,当2个就够的时候,就不在往下尝试了。通过在量词后面加个问号就能实现惰性匹配了。
1.2 纵向模糊匹配
纵向模糊指的是,一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。其实现的方式是使用字符组。
譬如[abc],表示该字符是可以字符“a”、“b”、“c”中的任何一个。比如/a[123]b/可以匹配如下三种字符串:"a1b"、"a2b"、"a3b"。
需要强调的是,虽叫字符组(字符类),但只是其中一个字符。例如[abc],表示匹配一个字符,它可以是“a”、“b”、“c”之一。
1.2.1 范围表示法
如果字符组里的字符特别多的话,可以使用范围表示法。比如[123456abcdefGHIJKLM],可以写成[1-6a-fG-M]。用连字符-来省略和简写。
因为连字符有特殊用途,那么要匹配“a”、“-”、“z”这三者中任意一个字符,该怎么做呢?不能写成[a-z],因为其表示小写字符中的任何一个字符。
可以写成如下的方式:[-az]或[az-]或[a\-z]。即要么放在开头,要么放在结尾,要么转义。总之不能和范围表示法一样就行了。
1.2.2 排除字符组
纵向模糊匹配,还有一种情形就是,某位字符可以是任何东西,但就不能是"a"、"b"、"c"。
此时就是排除字符组(反义字符组)的概念。例如[^abc],表示是一个除"a"、"b"、"c"之外的任意一个字符。字符组的第一位放^(脱字符),表示求反的概念。
1.2.3 纵向常见的简写形式
\d就是[0-9]。表示是一位数字。
\D就是[^0-9]。表示除数字外的任意字符。
\w就是[0-9a-zA-Z_]。表示数字、大小写字母和下划线。
\W是[^0-9a-zA-Z_]。非单词字符。
\s是[\t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。
\S是[^\t\v\n\r\f]。 非空白符。
.就是[^\n\r\u2028\u2029]。通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外。
多选分支
一个模式可以实现横向和纵向模糊匹配。而多选分支可以支持多个子模式任选其一。具体形式如下:(p1|p2|p3),其中p1、p2和p3是子模式,用|(管道符)分隔,表示其中任何之一。
例如要匹配"good"和"nice"可以使用/good|nice/。
但有个事实我们应该注意,比如用/good|goodbye/,去匹配"goodbye"字符串时,结果是"good"
也就是说,分支结构也是惰性的,即当前面的匹配上了,后面的就不再尝试了。