正则表达式-超详细解说

140 阅读5分钟

话不多说,本文将带你进入正则表达式的大门 , 文末推荐超级好用的在线正则练习工具哦!!!

字符组 [ ]

允许匹配一组可能出现的字符 , 例如: image.png 可以发现[Ll]既可以匹配大写的L也可以匹配小写的l

练习题: 利用字符组匹配多个单词: Java ,Jave , java , jave image.png

区间 -

上面字符组匹配中,我们可以想下下面这道题, image.png 为了解决这个问题, 在字符组中使用**连字符(-)代表区间 , **按照这个规则我们可以总结出:

  • 匹配任意数字 [0-9]
  • 匹配所有小写字母 [a-z]
  • 匹配所有大写字母 [A-Z]

例如: image.png

练习题: 利用区间匹配如下文本:

  • abcdefg
  • 012345678
  • 987654321
  • ABCDEFG

image.png

匹配特殊符号 \

有些情况下我们需要匹配 - . [ 等特殊字符,但是在正则表达式中,这些字符都需要经过转译,否则它将是正则的一部分,例如: image.png

取反 ^

顾名思义,例如: image.png

正则快捷方式 \w \d

上面我们学习匹配 0-9 或者 a-z 其实还有另一种快捷的表达, 如下:

快捷方式描述
\w与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_ ...
\d与任意数字匹配

匹配空白 \s

\s 快捷方式可以匹配空白字符,比如空格,tab、换行等。 image.png

单词边界 \b

什么是边界? 边界 指的是占位的字符左右的间隙位置。 看了很多文章我都不知道怎么用白话来解释这段话,但是,你可以理解为,你看不到的间隙就属于边界。 就拿lynn这个单词来说,你能看到它总共占了四个位置,这是看的见的,但是,l 这个单词的左边有个看不见的缝隙,最后面的 n 这个单词也有个看不见的缝隙,这个就叫做边界, 有一句英文可以很好理解, 例如 : image.png 这句话我们能看到的字符叫它占位字符, 包括空格在内有14个占位符, 如果我们想要匹配 m 这个字母, 在不加\b的情况下,会匹配到这段文本中的两个m, 这个毫无疑问,但是,如果我希望匹配到 第一个 m , 就需要加 \b 来限定了,因为单词边界的原因,第二个m无法被匹配中,那么为什么 第二个 m 就无法被匹配中呢? 又为什么第二个m 的右边就没有缝隙了呢?这就要说明了,正则中所说的单词指的是 \w 可以匹配的字符,即数字、大小写字母以及下划线 [0-9a-zA-Z_] 。 结论: 第一个m无论是左边还是右边的占位符都不能够被\w 匹配,而第二个m的右边是a,它可以被\w匹配。

例子: image.png 以上例子,使用单词边界匹配到了lynn 这个单词,如果不使用\b 得到的结果将是三个文本中的lynn都能匹配: image.png

快捷方式取反 \W \D

在前面我们使用过快捷方式匹配 \w \d 来匹配字母与数字,那如果不想匹配字母或者是数字,则可以使用 \W \D : image.pngimage.png

开始和结束 ^ $

在前面我们在字符组中使用过 ^ 来作为取反, 如果将^放在字符组外面,那它表示的则是 开始的意思: image.png image.png

任意字符 .

匹配除换行符之外的任何字符: image.png

可选字符 ?

有时候我们希望匹配一个单词,这个单词的其中一个字母可有可无, 这时候可选字符就可以派上用场了: image.png 它表示的是,出现 前面的字符 出现 0 或者 1 次。

重复匹配 {n}

如何匹配一个电话号码: image.png n 表示重复匹配多少次, \d 是我们前面所学的 匹配任意数字.

重复区间 {M,N}

可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。 这里重复区间就可以出场了,语法:{M,N},M是下界而N是上界。 例如: image.png \d{1,18} 既可以匹配15个数字也可以匹配18个数字,不过当有18个数字的时候,优先匹配的是18个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?号image.png

开闭区间 {1, }

有时候我们会遇到重复次数没有边界的情况,这时候使用开闭区间就可以实现: image.png 上述例子表示,匹配15个数字以上的文本。

开闭区间速写模式 + *

使用 + 匹配1个到无数个,使用 *代表0个到无数个。 即:+等价于{1,},*等价于{0,}。 例子: image.png

总结:

多种匹配模式

实例描述
[Ll]ynn匹配 “Lynn” 或 “lynn”。
[Jj]av[ae]匹配 “java” 或 “jave”。
[abcdef]匹配中括号内的任意一个字母。
[0-9]匹配任何数字。类似于 [0123456789]。
[a-z]匹配任何小写字母。
[A-Z]匹配任何大写字母。
[a-zA-Z0-9]匹配任何字母及数字。
[^au]除了au字母以外的所有字符。
[^0-9]匹配除了数字外的字符。
实例描述
.匹配除 “\n” 之外的任何单个字符。
?匹配一个字符零次或一次,另一个作用是非贪婪模式
+匹配1次或多次
*匹配0次或多次
\b匹配一个长度为0的子串
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。

正则在线练习工具: regexr-cn.com/