跳到主要内容

正则表达式

1、简介

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

JS 中的正则表达式 以 / 开始,以 / 结束。注意并不是一个字符串,不需要加引号或者双引号。

? 通配符匹配字符串中 0 或者 1 个字符。

* 通配符匹配 0 个或者任意个字符(注意匹配的是 * 前面的字表达式)。

1.1、简单的示例

1、 ^[0-9]+abc$

^ 表示匹配字符串的开始位置

[0-9]+ 匹配多个数字, [0-9] 匹配单个数字, + 匹配一个或者多个

abc$ 匹配字母 abc 并以 abc 结尾,$ 匹配字符串的结束位置

2、 ^[a-z0-9_-]{3,15}$

[a-z0-9_-] 匹配字母、数字、_、-

1.2、正则表达式的作用

  1. 校验输入的文字是否符合预期规则
  2. 替换文本
  3. 提取子串

2、语法

2.1、普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

[aeiou] 匹配字符串中所有的 a、e、i、o、u 字符

[^aeiou] 匹配字符串中所有非的 a、e、i、o、u 字符

[A-Z] 表示一个区间匹配所有的大写字母,[a-z] 匹配所有的小写字母

. 匹配除换行符(\n\r)外的任意单个字符,相当于[^\n\r]

[\s\S] \s 匹配所有的空白符,包括空格、换行、缩进 \S 匹配非空白符

\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]

2.2、非打印字符

\cx 匹配由x指明的控制字符

\f 匹配换页符

\n 匹配换行符

\r 匹配回车符

\s 匹配任何空白符

\S 匹配任何非空白符

\t 匹配制表符

\v 匹配垂直制表符

2.3、特殊字符

如果想要匹配特殊字符本身的时候,需要加上 \。例如 \$ 表示匹配 $ 字符,但是有些语言需要对 \ 进行转义,比如 Java 。 "\\$"

$ 匹配输入字符串的结束位置

() 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。

* 匹配前面的子表达式零次或多次

+ 匹配前面的子表达式一次或多次

. 匹配除换行符 \n 之外的任何单字符

[ 标记一个中括号表达式的开始

? 匹配前面的子表达式零次或者一次

\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符

^ 字符串开始

{ 标记限定符表达式的开始

| 指明两项之间的一个选择

2.4、限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

*+?{n}{n,}{n,m}

*+? 特殊字符处有说明

*+ 限定符都是贪婪的,它们会尽可能多的匹配文字,在它们后面加一个 ? 就可以实现非贪婪或最小匹配

n,m 都是非负整数

{n} 匹配确定的 n 次 {n,} 至少匹配 n 次 {n,m} 至少匹配 n 次,最多匹配 m 次

2.5、定位符

^$\b\B

\b 单词边界 \B 非单词边界

注意: 1、不能将限定符与定位符一起使用。 例如: ^* 个人理解:不可能同时出现两个局首、句尾、单词边界等。 2、若要匹配一行文本的开头,最好使用 ^ 3、若要匹配一行文本的结尾,最好使用 $

2.6、选择

用圆括号 () 将所有的选择项括起来,相邻的选项之间用 | 分隔。 () 表示捕获分组,() 会把每个分组的匹配值保存起来,多个匹配值可以通过数字 n 来查看

() 的作用

1、和算术运算中的括号一样,括号里面的内容会被看成一个整体 /(ab)+/ 。 2、小括号的内容会被存储起来,我们把小括号包括起来的代码片段称为子表达式。

2.7、反向引用

2.8、修饰符(标记)

标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。 写在表达式之外。 /pattern/flag i 忽略大小写 g 全局匹配 m 多行匹配 s . 会匹配 \n (正常情况下是不会匹配 \n 的)

2.9、元字符

  • \
  • ^ 字符串开头
  • $ 字符串结尾
  • * 任意次
  • + 至少一次
  • ? 至多一次
  • . 非 \n 的任意字符
  • *?+? 非贪婪模式
  • {n} n 次
  • {n,} 至少 n 次
  • {n,m} 至少 n 次,至多 m 次
  • (pattern)
  • (?:pattern)
  • (?=pattern)
  • (?!pattern)
  • (?<pattern>)
  • x|y 选择
  • [xyz] 匹配 xyz 中的任意一个
  • [^xyz] 匹配非xyz 字符
  • [a-z] 匹配小写字母
  • [^a-z] 匹配非小写字母
  • \b 单词边界
  • \B 非单词边界
  • \cx
  • \d 数字
  • \D 非数字
  • \f 换页
  • \n 换行
  • \r 回车
  • \s 空白字符
  • \S 非空白字符
  • \t 制表符
  • \v 垂直制表符
  • \w 字母数字下划线 [a-zA-Z0-9_]
  • \W 非字母数字下划线 [^a-zA-Z0-9_]
  • \xn
  • \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,(.)\1 匹配两个连续的相同字符;
  • \n
  • \nm
  • \nml
  • \um

2.10、运算符优先级

2.11、正则表达式中 []() 区别?

圆括号 () 是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理。
方括号 [] 是单个匹配。字符集/排除字符集/命名字符集。

()[] 有本质的区别:

() 内的内容表示是一个子表达式,()

本身不匹配任何东西,也不限制匹配任何东西,只是把括号里面的内容作为同一个表达式来处理,例如 (ab){1,3} 就表示 ab 一起连续出现最少 1 次,最多 3 次。如果没有括号的话,ab3,就表示 a 后面紧跟着的 b 出现最少 1 次,最多 3 次。

[] 表示匹配的字符在 [] 中,并且只能出现一次,并且特殊字符写在 [] 会被当成普通字符来匹配。例如 [(a)] ,会匹配 ( 、a、) 这三个字符。

所以 ()[] 无论是作用还是表示的含义,都有天壤之别。

注意:[] 里面的特殊字符会被当成普通字符处理 例如 * . +

3、常用正则表达式

3.1、字符串去掉非数字字符

// 去掉非数字的字符
parseInt('1ABC\n1zxc'.replace(/[\D]*/gm, "") || "-1");

3.2、邮箱

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

3.3、\d[0-9] 的区别?

\d 可以匹配全角数字,但是 [0-9] 不行

3.4、忽略大小写

(?i)(varchar2|number)aaa
  • (?i):忽略大小写。
  • (varchar2|number):匹配varchar2或number。
  • aaa:匹配aaa。

3.5、中文

[\u4e00-\u9fa5]