什么是正则?
正则是用于匹配字符串的字符组合的模式。正则不是一门编程语言,而是编程语言中会用到的一个工具,不管什么编程语言,都会用到正则表达式。
举个栗子:
想在以下文字中匹配以keai结尾的文字
".+"表示"某" ".+keai" 成功匹配
再举个栗子:
想在以下文字中匹配以chi开头的文字
"chi.+" 成功匹配
为什么用正则?
除了正则,可以在程序中写一个解析器代替正则的工作。但是有了正则,一行代码就可以搞定~
正则核心语法
一个很好用的在线解析正则的网站
https://regexr.com/
最简单的情况:直接用文字匹配
以下情况无法匹配 因为圆葱aa是一个整体 在下面的字符串找不到匹配字符
当想要匹配圆某时 可以使用"圆."来匹配
不难判断出
1. "."的含义:匹配除断行外任意一个字符
如图 匹配了所有字符
栗子1:
栗子2:
注意:断行不可匹配!!!!如下图
一个特殊情况 当我们想要匹配3.14时 图中匹配的结果却是3.14和3-14
这是因为"."代表任意字符
那么如何才能明确匹配到3.14呢?这就需要转义符"\"
"\."代表"." 如图 即可明确匹配到3.14
2."w" 匹配阿拉伯数字,英文大小写字母和下划线(类似于用户名的格式)
3."W" 匹配被"w"排除在外的字符("w"的补集)
4."d" 匹配阿拉伯数字
注意:"\d\.\d"匹配小数
5."\D" 匹配非阿拉伯数字 包括空格("\d"的补集)
6."\s" 匹配空白字符:空格 制表符 断行等
7."\S" 匹配被"\s"排除在外的字符("\s"的补集)
8."[]"字符集合方括号中填写出现的可能性(范围) 整个括号算一个字符
举个栗子:
"-"在"[ ]"表示表示从一个字符到另一个字符
举个栗子就懂~
匹配a到z
匹配0到9
9.当需要匹配中文时 使用Unicode
Unicode是万国码,是用数字代表文字的一项标准。世界上所有可以书写,发音的语言都被Unicode所吸纳。
中文字符从0x4e00(19968)开始 0x9fa5(40869)结束
也就是说 记录在Unicode中的中文字符有20901个字~
可以查询Unicode的网站
http://graphemica.com/
10."[范围]+"重复一次或多次
注意特殊情况 (应用到前面所说 方括号代表范围)
11."[范围]*"重复零次或多次
12."[范围]?"重复零次或一次
13."{a,b}"指定重复范围(a到b次)
"b" word boundary 单词边界
想精确匹配一段字符 必须重复几次 也可在花括号中指定
想指定某字符至少重复几次 也可在花括号中指定
至少重复两次
{0,}相当于"+" {0,1}相当于"?" {1,}相当于"*"
14.分组匹配
直接举个栗子来说
我们希望 替换句子中两个姓名的位置。如何实现? 这就要用到分组匹配。
首先 使用圆括号将两个人名摘出来(也就是分组)
"$1"代表第一组(李栓蛋) "$2"代表第二组(王花花)
这样看来 想替换两名字的位置就简单极了
so easy
一次性将两个句子都替换了
这就是分组的强大之处:可以将我们指定的组暂时缓存,用序号表示,也可以命名(JS暂时不支持命名)
15.分组匹配但不捕获
首先看几组电话号码
前4个为移动号码 第5个为联通号码 最后一个为电信号码
首先我们想要选中所有的移动号码 然后拿到它们的后四位
首先我们在乎的是前三位(一个号段) 然后是中间四位(我们并不在乎它们是什么) 最后是我们想要获取的四位(由于是我们最后想要获取的 所以我们用括号括起来 说明它是一个组)
然后通过看号段 将其它号码排除在外 也就是说 我们只匹配137138182183这四种号段的电话号码 可以使用以下写法
现在我们既匹配了所有移动号码 又获取到了他们的后四位
此时我们只用到了第2组,也就是说我们的第一组是浪费的。我们只是想用这种方式匹配它而并不想要获取。有没有这种操作呢?当然有。
(?:模式)匹配分组但不捕获
这样一来就不浪费了~
16.正向预查
首先看这坨字符
前面是货币值,后面是货币单位。
现在我们的任务是,选中所有以元结尾的数字(不包括单位)
当我们需要匹配单位时
但我们现在的任务是 只获取数字 不包括单位 此时就需要用到正向预查
(?=模式) 正向肯定预查
它的含义就是 前面是我们要匹配的东西 后面一定是等号后面的东西 但是不匹配它
(?!模式) 正向否定预查
这句的意思是 匹配所有的数字 后面不是元的
我们希望匹配100刀和100磅 但是匹配结果和我们预想不同
这就需要我们注意 当使用反向预查时 我们后面要将前面匹配的类型排除在外。
这就成功匹配了。
17.反向预查
上面我们提到正向预查 正向预查是 我们要匹配的东西的右边一定是什么
而反向预查是 我们要匹配的东西的左边一定是什么
我们的任务是 匹配所有人民币的数额
(?<=模式) 反向肯定预查
注意:JS引擎不支持反向预查 右上角切换一个更加完善的引擎即可~
与之相反的是反向否定预查
(?
我们发现 跟之前出现了同样的问题
同理前面所说 应用反向预查时要将后面匹配的类型排除在外
这样就可以匹配到非人民币的货币数额~非常强大!