循序渐进javascript中的正则表达式
疑问?
正则表达式是javascript处理表单,处理字符串的一个易上手且强大的工具,本文从0开始,通过分离概念,划分职位,赋予作用来循序渐进学习正则表达式,掌握js中这一强大的工具
分析:
test/match : 正则表演的舞台
正则表达式是js中的一个数据类型,属于引用数据类型
let reg = /hello/; or let reg = new RegExp('hello');
// 可以发现 /.../ 就代表一个正则对象,内部就是匹配原则
regExp 的test方法,可以以string为参数,判断string中是否有符合正则的部分,返回值为布尔值
let isExist = reg.test('hello,world!');
String中有很多方法都可以使用正则为参数来作为匹配原则
String -> search(reg) | replace(reg,newString) | split(reg) | match(reg)
字符:正则表达式的基石
如果将写出一个能达成目标且易读优雅的正则比作搭建建筑,那么几种匹配模式就是它的基石,我们从3个最基本的匹配来循序渐进认清看起来吓人的正则
var string = 'hello,Reg!'
var regStr = /Reg/ // 匹配Reg
var regDot = /./g // 匹配 h e l l o , R e g !
var regChar = /[Reglo]/g //匹配 e l l o R e g
相信可以从例子看出来,string只能匹配一摸一样的字符串并返回,.可以匹配所有内容,[...]字符集中只要其包含就会匹配
前两个都易于理解,但第三个字符集有很多的拓展和抽象,可以继续分析
var string = 'hello,char!'
var regChars = /[c-z]/g //匹配了从c到z的所有小写字母,返回 h e l l o c h r
var regcharsNot = /[^c-z]/g // 匹配了上一个的非集,返回 , a !
又例子很好理解,连字符解决了匹配很多字符时过多浪费键盘寿命的问题(笑),而否定字符集反向匹配效果强大,适用于否定要求的正则
元字符又是一次连字符的抽象,常见的元字符如下:
| 元字符 | 抽象的等效字符集 |
|---|---|
| \w | [A-Za-z0-9_] 注意有下划线 |
| \W | \w 的非集 |
| \d | [0-9] |
| \D | \d 的非集 |
| \s | [ \r\t\f\n\v] 匹配空格,回车,制表,换页,换行 |
| \S | \s 的非集 |
可以看出来,字符集中匹配不同群体的连续字符直接在后面写(组合)就可以了 比如:[A-Z0-9]:匹配了大写字母和数字
符号与标志:字符匹配的DLC
如果光用字符一个一个匹配想要的字符串,如果匹配字符串长度为120,那我的字符就要写120次,如果我的匹配字符是动态的,部分变化仍然要选中,那岂不是没有用了,所以我们就需要符号,作为字符匹配的DLC增加字符匹配的功能,提高正则的可用性
var string = 'hello,symboooooolol!'
var regPlus = /bo+/ //匹配了b和其后 的1个或者多个o 返回 boooooooo
var regMult = /mo*/ //匹配了m和其后 的0个或者多个o 返回 m 而非 没有匹配
var regNums = /bo{3,6}/ //匹配了b和其后的 3个到6个o 返回 boooooo 还有{3.} 3-无上限 {3} 3个 的使用
var regEnd = /!$/ //匹配了最后一个字符是否为符号前的字符 返回 ! 不是则返回没有匹配
var regLazy = /bo+?l/ //正则默认贪婪匹配到boooooolol, 但通过?懒惰匹配 返回booooool , ? 只能在 + * 后使用
var regStart = /^h/ //匹配了第一个字符是否为符号后的字符 返回h 不是则返回没有匹配,注意与否定字符集区分
由以上的例子就可以了解了正则的符号如何使用
常用的标志正则表达式由两个,标志的位置比较特殊,写在正则表达式的斜杠符号之外
i: 使匹配的字符无视大小写
g:使满足正则的字符串都会被匹配(全局匹配)
var string = 'hello,char,CHAR!'
var regCHAR = /CHAR/i //匹配了无视大小写的char 返回 char
var regCHARs = /char/gi // 匹配了无视大小写的所有char 返回 char CHAR
这样:
一个简单的正则表达式可以看作 : 正则变量字面名 = /^字符符号...字符符号...字符...字符$/标志
模式,混合,断言:从简单走向复合的正则表达式
当我们完成一个简单正则时,却会发现不一定能符合复杂的匹配要求,比如我即需要一个字符串3个字符串,且当3个字符时必须全为字母字符,这个时候就需要多个简单正则来完成了
多模式匹配 |
var str1 = 'ssr'
var sre2 = 'rrs4'
var regAdd = /^[a-z]{3,}\d*$|^[a-z]{3}$/gi // 该正则可以用来匹配大于3位的字母或数字的组合,且3位时必须为字母
可以看到,当出现if 条件时,可以通过多模式匹配将简单正则复合达到多条件筛选的目标
捕获
var strs = 'ssr ssr ssr ,SSR!';
var regCapture = /(ssr) \1 \1/ //返回 ssr ssr ssr
//捕获用()圈住简单正则,并且可以通过\1,[2,3] (多捕获一次匹配) 来表示捕获reg达到重复匹配时复用的目的
捕获可以减少重复匹配而且易于捕获动态值
(捕获)中的match
strs.match(regCapture); // Returns ["ssr ssr ssr", "ssr"]
在字符串上调用 .match() 方法将返回一个数组,其中包含它最终匹配到的子字符串及其捕获组。
(捕获)中的replace
let strNum = "one two three";
let Reg = /(one) (two) (three)/;
let reverse = "$3 $2 $1";
let result = strNum.replace(Reg, reverse); // 返回 three two one
可以在字符串上使用 .replace() 方法来搜索并替换字符串中的文本。 .replace() 的输入首先是想要搜索的正则表达式匹配模式。 第二个参数是用于替换匹配的字符串或用于执行某些操作的函数。你还可以使用美元符号($)访问替换字符串中的捕获组。
断言:不匹配
一般用于验证,匹配但不获取
var strAssert = 'a regular String';
var regAssert = /re(?=gular)/;
let result = strAssert.match(regAssert); //必须由regular ,但返回re
总结。
可以看到正则表达式是从字符开始的对字符串的匹配,符号和标志是拓展,最后形成一个简单表达式,然后通过混合形成复合表达式解决实际问题
正则一图总结流: