Regux教程
上周面米哈游data engineer岗时,被暴打一顿,很多基础的应用知识完全忘了。
记得当时面试官这么问我: 诶我看你简历上也写过做过前端相关的东西,那么你应该对正则表达式很熟悉吧,帮我写一个匹配所有正整数的正则。 我: …
虽说这个只是一个很小的题目,但是对我而言是一个很大的打击,今天我痛定思痛,准备好好整理一下这方面的知识点.
Regex 完整教程
Regex 定义:
Regex: Regular Expression, 他所做的事情就是帮你匹配指定规则的字符串.而且它在计算机中的应用非常广泛:
- 编译器中的词法分析器,会使用正则去匹配代码中的关键字
- 网站上注册表单,会使用正则来判断密码的复杂程度
- 在爬虫中,我们同样可以使用正则表达式提取我们需要的信息。
使用这个网站来进行正则表达式的测试: regex101
Regex 语法
限定符:
限定符限定的是前一个字符。
?
可以匹配?
之前1个字符或者0个字符*
可以匹配0个或者多个字符+
可以匹配出现1次以上的字符{start, end}
指定之前字符出现的次数,如果没有end限制那就{start,}
(字符)
可以匹配一个组合,比如’ab’, 那就(ab)+即可
或运算符:
|
字符 (字符1|字符2|… |字符n)[字符]+
更高级,可以直接匹配所有[]
中间指定的字符类,可以替换(字符1|字符2)
的操作。[字符]+
可以直接指定字符[a-zA-Z0-9]+
可以指定范围^
如果在前面写一个^
,表示非的意思
元字符(特殊字符)
-
\d+
代表数字字符 -
\w
代表单词字符 -
\s
代表空白符(包含Tab和换行符) -
\D
代表非数字字符 -
\W
非单词字符 -
\S
非空白字符 -
\.
句号字符 -
.
代表任意字符,但不包含空格符,换行符 -
^
代表匹配行首 -
&
代表匹配行尾
几个例子:
-
匹配HTML 里的标签<>符号:
/<.+?>
因为: *, + {}在匹配字符串的时候,默认会去匹配尽可能多的字符,解决方案就是: 加一个’?'就行啦。
这种情况下,只想要匹配span中的东西:
<span>hello <span>
, 你自然地会想到使用<.+>
,但是这样会进入贪婪匹配,匹配最多的范围,那么如果想解决这个问题,用这一招:<.+?>
就可以成功匹配了。 -
匹配所有的颜色字符:
/#[a-fA-F0-9]{6}+/b
注意这里\b是用来限定单词的边界的,表示这个单词不会出现在其他单词之中,到此就为止了。 -
匹配ipv4地址:
ipv4的地址实际上是由四段数字组成,那么这个需要分类讨论来解决,这个会比较复杂,但是其实也不是很困难。
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b
那么最后回到原来的问题,如何匹配一个十进制数字呢? 其实非常简单:
^[1-9]\d*&
就行啦!
因为^表示字符以什么开头,那么很显然是以[1-9]的数字开头的,之后[0-9]我可以接无限个,也可以不接,所以是\d*结尾,最后&也就是表示以这个结尾。
最后,放一个参考表: