Loading

正则表达式

整体概览

实例 描述
[Pp]ython 匹配 “Python” 或 “python”。
rub[ye] 匹配 “ruby” 或 “rube”。
[abcdef] 匹配中括号内的任意一个字母。
[0-9] 匹配任何数字。类似于 [0123456789]。
[a-z] 匹配任何小写字母。
[A-Z] 匹配任何大写字母。
[a-zA-Z0-9] 匹配任何字母及数字。
[^au] 除了au字母以外的所有字符。
[^0-9] 匹配除了数字外的字符。
实例 描述
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\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_]‘。

字符匹配

字符组

字符组[]允许匹配一组可能出现的单个字符,我们需要匹配的多个字符之间紧密相连,不需要符号隔开。

注意:字符组中仅仅匹配某一个字符,如果已经确定要匹配的字符那么就不必用字符组了。

[Pp]ython
可以选择出
python
Python

区间

区间-允许我们匹配指定区间内的字符,减少了我们的书写个数。

  1. 要匹配任意数字可以使用[0-9]
  2. 如果想要匹配所有小写字母,可以写成[a-z]
  3. 想要匹配所有大写字母可以写成[A-Z]
  4. 如果想要匹配从5到8的数字可以写成[5-8]

匹配特殊字符

有时候我们想要匹配的字符恰好在正则表达式中有其特定的含义,这时候我们在其前面加\进行转义。

比如我们想要匹配字符-,可是字符-在字符组中表示区间,这时我们就可以使用转义符\对其转义。

匹配所有的字符 -
[\-]

取反

取反符号^仅在字符组中表示取反符号,表示不采取字符组中^后列出的单词.

比如[^123]表示匹配除了1,2,3之外的所有字符。

快捷方式匹配

匹配空白

\s表示匹配空白字符,其中包括空格、tab、换行等

匹配数字和字母

\w表示匹配任意字母,包括大小写,等同于[a-zA-Z]

\d表示匹配任意数字,等同于[0-9]

单词边界

有时我们只想匹配单个单词,这时候我们就需要匹配单词边界\b符号

比如我们有句子i play on playground,如果我们直接使用play对单词 play 进行匹配,会将单词playground 中的 play 也匹配进去。

这时,我们就需要使用到单词边界,来进行匹配 \bplay\b 就可以匹配出单个 play 单词。

快捷方式取反

快捷方式取反只需要大写字母即可。

比如 \W\D\S\bplay\B(指的是提取非单词边界的play)等

开始和结束

正则表达式中 在字符组外^指定的是一个字符串的开始,$指定的是一个字符串的结束。

比如这里有两句话

python is my favourite
this code in python

^python表示提取以 python 开头的字符串。

python$表示提取以 python 结尾的字符串。

任意字符

.字符代表匹配任何单个字符,它只能出现在方括号字符组以外

可选字符

有时,我们可能想要匹配一个单词的不同写法,比如colorcolour,或者honorhonour

这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次

比如honou?r u? 表示u是可选的,即可以出现也可以不出现,可以匹配的是 honorhonour

如果是.?则表示任意一个可选字符,可出现也可不出现。

匹配多个字符

重复

在字符后面加上{N}代表这个字符重复的次数。

比如\d{4},表示\d重复四次,等同于\d\d\d\d,表示匹配一个四位数字。

重复区间

可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。

这里重复区间就可以出场了,语法:{M,N}M是下界而N是上界。

比如我们要匹配三位数,四位数和五位数,就可以用\d{3,5}来进行匹配。

\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?

开闭区间

{1,}表示字符的重复没有边界,表示匹配一个或无数个。

+等同于{1,}

*等同于{0,}

分组

分组提取

在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。

要实现分组很简单,使用()即可。

比如我先要提取<div>hello</div>中的 hello ,我们可以使用 <div>(.*?)</div>

或条件

使用分组的同时还可以使用 或者or)条件。

例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号。

比如(.jpg|.gif|.png)

非捕获分组

有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。

这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。

比如0731-75855,我们只要提取出75855,可以用(?:\d{4})-(\d{5})

分组回溯

分组的回溯引用,使用\N可以引用编号为N的分组。

比如我们有<div>hello</div>,我们可以使用<(\w+)>(hello)</\1>,这里面的\1就代表了,表达式中第一个分组所中的值。

贪婪模式和非贪婪模式

贪婪模式:正则表达式趋向于最大长度的匹配,总是尽可能多的匹配字符。

非贪婪模式:正则表达式趋向于最短长度的匹配,总是尽可能少的匹配字符。

比如这里有字符串abcdefabc

这里有正则表达式a.*c

在贪婪模式下匹配到的结果为:abcdefabc

在非贪婪模式下匹配到的结果为:abc

在正则表达式中,默认时贪婪模式,如果我们要使用非贪婪模式需要在量词后面加个?,比如a.*?c

posted @ 2022-07-04 15:34  brokyz  阅读(61)  评论(0编辑  收藏  举报