[再次复习]正则匹配

170 阅读4分钟

容易忘的

  1. 小写字母是本意,大写字母是‘非’本意
  2. [] {} () 的作用
  3. ? + * 的含义

锚点

  • 锚点就是匹配位置,记住是匹配位置 ^-字串或行的开头 eg:
// 匹配`an`
an answer or a question
// [w]ord,^放在表达式前面
/^\w+/

$-字串或行的末尾

// 匹配 'question'
an answer or a question
// $ 放在表达式后面
/\w+$/

\b- 单词边界

  • 匹配单词开头或末尾
  • 其实就是所有\w和\W字符之间的
// 匹配 n 结尾的单词
an answer or a question number
解析:\b在n后表示以n结尾
/n\b/

解析:如果是匹配'number'
/\bn/

\B- 非单词边界

  • 匹配不在单词开头或末尾的位置
// 匹配answer
an answer or a question
解析:单看\B,意思是所有\w和\W是\b,那么不是\b就是\B,两个\w之间的位置
用#表示出来了`a#n a#n#s#w#e#r o#r a q#u#e#s#t#i#o#n n#u#m#b#e#r`,
下面的表达式,代表了\B位置前是一个‘n’的情况
/n\B/

多看个例子:
如果字符串是 an answer or a question number
那么不只是answer,包括number也会被匹配上,因为numbern后边是个\B
以此类推 \Bn 的意思就是找到\B的位置,其后是个n的单词

标志

i

  • 忽略大小写
  • ignore
q:匹配这个字串
CAT
/cat/i

g

  • 全局
  • 表达式不会在检索到第一个匹配项时停止。
q:找出所有的cat
cat cat cat
/cat/g

m

  • 多行
  • 如果不启用,^$ 只匹配整个字符串的开始和结束,而不会单独匹配每一行。
q:匹配所有的cat
cat
cat
a cat
下面这个也是可以的
/cat/g
但是如果匹配每一行以cat开头的呢?就得
/^cat/gm

组和引用

()

  • 引用表达式的分组
hahaha hah haha
匹配到所有ha
/(ha)+/g

\1

  • 引用
  • 引用表达式的分组,当然也可能是\2 \3,代表的是前面第n个小括号的内容
q:匹配所有 字符a字符 样式的字串
hah haa dad
这里的\1就相当于()里面的\w
/(\w)a\1/

还试了一下,如果要是匹配下面三个字串,用/(\w+)a\1/g时候发现,\w+匹配到什么
\1一定是相同的,不能吧比方\w+匹配到了ddsx,\1一定是ddsx,少个字符第三个都
匹配不上跟 /\w+a\w+/g 是不一样
tat dad ddsxaddsx

非捕获组

实际上是相对于捕获组而言 可以参考这个

字符类

字符名称含义
[]字符集匹配集合中的任意字符
[^]否定字符集匹配不在集合中的任意字符(注意这个跟锚点开头是一样的)。
[a-z]范围匹配两个字符之间的任意字符,包括它们本身。
.匹配除换行符之外的任意字符。
\w单词匹配字母、数字或下划线。
\W非单词匹配除字母、数字和下划线之外的任意字符。
\d数字匹配所有数字。
\D非数字匹配除数字外的任意字符。
\s空白符匹配所有空白字符。
\S非空白符匹配除空白字符以外的任意字符。

量词与分支

字符名称含义
?可选使表达式可选。
+加号表达式匹配一个或多个。
*星号表达式匹配零个或多个。
{n, m}重复表达式匹配指定范围的位数。至少n至多m
分支类似于“或”。用于匹配多种符合条件的表达式之一。eg: /(b|c)at/g

零宽断言

  • 零宽:只匹配位置,在匹配过程中,不占用字符,所以被称为零宽

(?=)

  • 正向先行断言
  • 正向:匹配括号中的表达式
  • 先行:正则引擎在扫描字符的时候,从左往右扫描,匹配扫描指针未扫描过的字符,先于指针,故称先行
q: 为了只匹配后面有 PM 的数值,我们需要在表达式后面使用正向先行断言 (?=)。
Date: 4 Aug 3PM
/\d+(?=PM)/g

(?!)

  • 负向先行断言
  • 负向:不匹配括号中的表达式
  • 先行: 正则引擎在扫描字符的时候,从左往右扫描,匹配扫描指针未扫描过的字符,先于指针,故称先行
例如,我们要在文本中匹配除小时值以外的数字。
我们需要在表达式后面使用负向先行断言 (?!),并在括号内的 ! 后面添加 PM,
从而只匹配没有 PM 的数值。

Date: 4 Aug 3PM
/\d+(?!PM)/g

(?<=)

  • 正向后行断言
  • 正向:匹配括号中的表达式
  • 后行: 匹配指针已扫描过的字符,后于指针到达该字符,故称后行,即产生回溯
我们要匹配文本中的金额数。为了只匹配前面带有 $ 的数字。
我们要在表达式前面使用正向后行断言 (?<=),并在括号内的 = 后面添加 \$。
Product Code: 1064 Price: $5
/(?<=\$)\d+/g

(?<!)

  • 负向后行断言
  • 负向:不匹配括号中的表达式
  • 后行: 匹配指针已扫描过的字符,后于指针到达该字符,故称后行,即产生回溯
我们要在文本中匹配除价格外的数字。
为了只匹配前面没有 $ 的数字,我们要在表达式前用负向后行断言 (?<!),并在括号内的 ! 后面添加 \$。
Product Code: 1064 Price: $5
/(?<!\$)\d+/g

贪婪匹配

正则表达式默认执行贪婪匹配。这意味着匹配内容会尽可能长。请看下面的示例,它匹配任何以 r 结尾的字符串,以及前面带有该字符串的文本,但它不会在第一个 r 处停止匹配。 ber beer beeer beeeer /.*r/ 匹配到所有后缀为r的字串

懒惰匹配

与贪婪匹配不同,懒惰匹配在第一次匹配时停止。下面的例子中,在 * 之后添加 ?,将查找以 r 结尾且前面带有任意字符的第一个匹配项。这意味着本次匹配将会在第一个字母 r 处停止。 ber beer beeer beeeer /.*?r/ 匹配到第一个ber