循序渐进javascript中的正则表达式

151 阅读4分钟

循序渐进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个最基本的匹配来循序渐进认清看起来吓人的正则

image.png

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只能匹配一摸一样的字符串并返回,.可以匹配所有内容,[...]字符集中只要其包含就会匹配

前两个都易于理解,但第三个字符集有很多的拓展和抽象,可以继续分析

image.png

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增加字符匹配的功能,提高正则的可用性

image.png

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个字符时必须全为字母字符,这个时候就需要多个简单正则来完成了

image.png

多模式匹配 |

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

总结。

可以看到正则表达式是从字符开始的对字符串的匹配,符号和标志是拓展,最后形成一个简单表达式,然后通过混合形成复合表达式解决实际问题

正则一图总结流:

image.png