上周面米哈游data engineer岗时,被暴打一顿,很多基础的应用知识完全忘了。

记得当时面试官这么问我: 诶我看你简历上也写过做过前端相关的东西,那么你应该对正则表达式很熟悉吧,帮我写一个匹配所有正整数的正则。 我: …

虽说这个只是一个很小的题目,但是对我而言是一个很大的打击,今天我痛定思痛,准备好好整理一下这方面的知识点.

Regex 完整教程

Regex 定义:

Regex: Regular Expression, 他所做的事情就是帮你匹配指定规则的字符串.而且它在计算机中的应用非常广泛:

  • 编译器中的词法分析器,会使用正则去匹配代码中的关键字
  • 网站上注册表单,会使用正则来判断密码的复杂程度
  • 在爬虫中,我们同样可以使用正则表达式提取我们需要的信息。

使用这个网站来进行正则表达式的测试: regex101

Regex 语法

限定符:

限定符限定的是前一个字符。

  1. ? 可以匹配? 之前1个字符或者0个字符
  2. *可以匹配0个或者多个字符
  3. +可以匹配出现1次以上的字符
  4. {start, end}指定之前字符出现的次数,如果没有end限制那就{start,}
  5. (字符) 可以匹配一个组合,比如’ab’, 那就(ab)+即可

或运算符:

  1. | 字符 (字符1|字符2|… |字符n)
  2. [字符]+ 更高级,可以直接匹配所有[]中间指定的字符类,可以替换(字符1|字符2)的操作。
    • [字符]+ 可以直接指定字符
    • [a-zA-Z0-9]+ 可以指定范围
    • ^ 如果在前面写一个^,表示非的意思

元字符(特殊字符)

  1. \d+ 代表数字字符

  2. \w 代表单词字符

  3. \s 代表空白符(包含Tab和换行符)

  4. \D 代表非数字字符

  5. \W 非单词字符

  6. \S 非空白字符

  7. \.句号字符

  8. . 代表任意字符,但不包含空格符,换行符

  9. ^代表匹配行首

  10. &代表匹配行尾

几个例子:

  1. 匹配HTML 里的标签<>符号:

    /<.+?>

    因为: *, + {}在匹配字符串的时候,默认会去匹配尽可能多的字符,解决方案就是: 加一个’?'就行啦

    这种情况下,只想要匹配span中的东西: <span>hello <span>, 你自然地会想到使用<.+>,但是这样会进入贪婪匹配,匹配最多的范围,那么如果想解决这个问题,用这一招:<.+?>就可以成功匹配了。

  2. 匹配所有的颜色字符:

    /#[a-fA-F0-9]{6}+/b 注意这里\b是用来限定单词的边界的,表示这个单词不会出现在其他单词之中,到此就为止了。

  3. 匹配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*结尾,最后&也就是表示以这个结尾。

最后,放一个参考表:

image-20230828110448063