可有可⽆正则_正则表达式⼊门-RegularExpression
前⾔:正则表达式是真的不容易搞懂,有时查完各个字符的含义也还是会是⼀脸懵,但是⼊门还是很容易的,这⾥就简单学习⼀下正则表达式。
1.正则表达式是什么?
规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的⼀个概念。正则表达式通常被⽤来匹配,检索和替换那些符合某个模式(规则)的⽂本等。
简单来说就是代表了⼀个规则,通过这个规则可以匹配字符串。
2.正则表达式的基础语法
' . ' 点表⽰的是可以匹配除了(n)换⾏符以外的任意⼀个字符(数字,字母,特殊字符)
' [ ] ' ⽅括号表⽰匹配⼀个范围,⼀个集合
⽐如:
1. [0-9] 表⽰的是0-9之间的任意⼀个数字
2. [a-z] 表⽰的是所有的⼩写字母中的任意⼀个
3. [A-Z] 表⽰所有的⼤写字母中的任意⼀个
4. [a-zA-Z] 表⽰所有的字母中任意⼀个
5. [0-9a-zA-Z] 表⽰所有字母和数字中的任意⼀个
' | ' 表⽰的是或者
[0-9] | [a-z] : 要么是⼀个0-9之间的数字,要么是⼀个⼩写字母
' ( ) ' 表⽰分组,提升优先级(优先计算括号内,多组括号就从左到右开始)
' * ' 表⽰前⾯的表达式出现了 0次
多次
0次到 多次
[a-z][0-9]* : ⼀个⼩写字母后有数字0-多个 ⽐如fgh34444或者hdd
1次到多次,也就是⾄少出现⼀次
' + ' 表⽰的是前⾯的表达式出现了 1次到多次
[a-z][9]+ :⼀个⼩写字母后⾄少有⼀个9或者多个9 ⽐如hdch8777 就不匹配,hsb9 √
' ? ' 表⽰前⾯的表达式出现了0次到1次,最少0次,最多1次
[4][a-z]? : "1234be"
'{ }' 限定前⾯表达式出现的次数
⽐如:
1. {0,} 表⽰前⾯表达式出现了0次到多次
0次到多次,和 * ⼀样
1次到多次,和 + ⼀样
2. {1,} 表⽰前⾯表达式出现了1次到多次
0次到1次,和 ? ⼀样
3. {0,1} 表⽰前⾯表达式出现了 0次到1次
5-10次
4. {5,10} 表⽰前⾯表达式出现了5-10次
5次
5. {5} 表⽰前⾯的表达式出现了5次
' ^ ' 表⽰以什么开始 或者取⾮(反)
⽐如:
以什么开始 表⽰匹配的字符串要以数字开头
1. ^[0-9] 以什么开始
取反,也就是说匹配的字符串要是⾮数字
2. [^0-9]取反
取反,就是取特殊符号
3. [^0-9a-zA-Z_] 取反
' $ ' 表⽰以什么结尾 (⽐如[0-9]$ 就是必须以数字结尾)
^和$ 相当于严格模式
^[a-z][0-9]$ 必须以⼩写字母开头,以数字结尾
cdsjb678✘ b5✔
d 数字中的任⼀个,相当于[0-9]
D ⾮数字的任⼀个, 相当于[^0-9]
s 空⽩符中任意⼀个
S ⾮空⽩符
w ⾮特殊符号 相当于[0-9a-zA-Z_]
W 特殊符号 相当于 [^0-9a-zA-Z_]
b 单词边界
3.正则表达式⼩案例
匹配座机: ⽐如0531-******** ⼀般都是3/4位+-+7/8位
d{3,4}[-]d{7,8} (即随机数字中的⼀位出现3-4次,紧跟着-,然后就是数字出现7-8次)
d{3,4}[-]d{7,8}
匹配邮箱:⽐如changanyouren@163
分析电⼦邮件组成⼀般为<yourname>@<domain>.<extension><optional-extension>
yourname:任意英⽂字母(a-z/A-Z)、数字(0-9)、下划线(_)、英⽂句点(.)、连字符(-),长度⼤于 0。----------->[0-9a-zA-Z_.-]+
domain:任意英⽂字母(a-z/A-Z)、数字(0-9)、下划线(_)、英⽂句点(.)、连字符(-),长度⼤于 0。------------>[@][0-9a-zA-Z_.-]+
extension:任意英⽂字母(a-z/A-Z),长度⼤于0
optional-extension:"."开头,后⾯跟任意英⽂字母(a-z/A-Z),可有可⽆
上⾯两部分即域名部分,⼀般域名有⼀级⼆级之分,所以是 . 字母任意⼀位出现1-多次,再利⽤括号分
组,这⼀组出现⼀次即⼀级域名,出现两次即⼆级域名。 -------------->([.][a-zA-Z]+){1,2}
最终:[0-9a-zA-Z_.-]+[@][0-9a-zA-Z_.-]+([.][a-zA-Z]+){1,2}
4.RegExp 对象的简单使⽤
①创建RegExp对象和test⽅法
//通过构造函数的⽅式创建Regexp对象
var reg = new RegExp(/d{5}/) //匹配5个数字
//通过字⾯量的⽅式创建Regexp对象
var reg = /d{5}/
test() ⽅法⽤于检测⼀个字符串是否匹配某个模式,如果字符串中含有匹配的⽂本,则返回 true,否则返回 false。
②提取⼀个字符串内所有数字
⽐如有这样的⼀串字符串‘⼩红学号:172638,⼩兰学号:237918,⼩王学号:617289’,我想要将其中所有数字提取出来。
match()是字符串的⽅法,传⼊正则表达式,返回数组
g : 在正则表达式中表⽰全局匹配,这⾥就是将匹配的3组都提取出来了
正则表达式获取括号内容③ i :在正则表达式⾥忽略⼤⼩写
利⽤字符串的replace⽅法替换了所有的h
④'$2','$1'等等: 提取某⼀组
const str = "2018-06-18"
const array = atch(/(d{4})[-](d{2})[-](d{2})/g)
console.log(RegExp.$3) //18
⑤正则表达式exec⽅法
⼀个在字符串中执⾏查匹配的RegExp⽅法,返回⼀个数组,未匹配返回null
⑥正则表达式match⽅法
⼀个在字符串中执⾏查匹配的String⽅法,返回⼀个数组,未匹配则返回null
⑦exec⽅法和match⽅法的区别
1. exec是正则表达式的⽅法,⽽不是字符串的⽅法,它的参数才是字符串,如下所⽰:
var reg = new RegExp( "abc")
var str = "3abc4,5abc6"
<(str );
2. match是字符串执⾏匹配正则表达式规则的⽅法,他的参数是正则表达,如
var reg = new RegExp("abc")
var str = "3abc4,5abc6"
str.match(reg);
3. exec和match返回的都是数组(正则表达式⽆⼦表达式,并且定义为⾮全局匹配)
如果exec执⾏的正则表达式没有⼦表达式(⼩括号内的内容,如/abc(s)/中的(s) ),如果有匹配,就返回第⼀个匹配的字符串内容,此时的数组仅有⼀个元素,如果没有匹配返回null;
var reg = new RegExp("abc")
var str = "3abc4,5abc6"
(str));
alert(str.match(reg));
执⾏如上代码,你会发现两者内容均为⼀样:abc,
4. 如果定义正则表达对象为全局匹配如(正则表达式⽆⼦表达式,并且定义为全局匹配)
var reg = new RegExp("abc","g")
var str = "3abc4,5abc6"
(str));
alert(str.match(reg));
则 为abc和abc,abc;因为match执⾏了全局匹配查询;⽽exec如果没有⼦表达式只会到⼀个匹配的即返回。
5. 当表⽰中含有⼦表达式的情况(正则表达式有⼦表达式,并且定义为⾮全局匹配):
var reg = new RegExp("a(bc)")
var str = "3abc4,5abc6"
(str));
alert(str.match(reg));
你会发现两者执⾏的结果都是:abc,bc;
6. 当如果正则表达式对象定义为全局匹配(正则表达式有⼦表达式,并且定义为全局匹配)
var reg = new RegExp("a(bc)","g")
var str = "3abc4,5abc6"
(str));
alert(str.match(reg));
则两者返回的结果是abc,bc和abc,abc,
总结
1. 当正则表达式⽆⼦表达式,并且定义为⾮全局匹配时,exec和match执⾏的结果是⼀样,均返回第⼀个匹配的字符串内容;
2. 当正则表达式⽆⼦表达式,并且定义为全局匹配时,exec和match执⾏,做存在多处匹配内容,则match返回的是多个元素数组;
3. 当正则表达式有⼦表⽰时,并且定义为⾮全局匹配,exec和match执⾏的结果是⼀样如上边的第5种情况;
4. 当正则表达式有⼦表⽰时,并且定义为全局匹配,exec和match执⾏的结果不⼀样,此时match将忽略⼦表达式,只查全匹配正则
表达式并返回所有内容,如上第6种情况;
谢谢!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论