正则表达式总结

525 阅读5分钟

参考地址:www.runoob.com/regexp/rege…

为啥写的原因是,做前端很久了,但是正则的书写还是百度,所以就在这里把用得到的全部写上,下次有需要,直接看自己写的。

常用表达式

手机号校验

校验规则使用了^ [] \d {} $,分别代表着

  1. 排除1以外的其他数字
  2. [3-9]这个区间内的数字
  3. \d 匹配数字字符
  4. {3,9}第三位起,替换9位数字
  5. 起结束作用假设你没有写最后 起结束作用 假设你没有写最后,即使超出位数,依然为true
let phone = /^1[3-9]\d{3,9}$/
console.log(phone.test(手机号))
// true

邮箱校验

  1. ^[a-zA-Z0-9]第一位开头必须是大小写字母或数字
    • 起和第二位拼接的左右
  2. \w 第二位起就比较随意,数字,字母,下划线都成
  3. @ 拼接@符号
  4. 最后的是一个整体,分前部分数字,字母加.和后半部分数字,字母
let email = /^[a-zA-Z0-9]+\w+@([a-zA-Z0-9]+\.+[a-zA-Z0-9])/
console.log(email.test(邮箱号))

正则的概念

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

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

语法

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

普通字符

[ABC] 匹配[***]中的所有字符

let string = 'abc1efg'
console.log(string.replace(/[0-9]/g, 'M'))
// abcMefg

[^ABC] 匹配除了 [***] 中字符的所有字符

let string = 'abc1efg'
console.log(string.replace(/[^0-9]/g, 'M'))
// MMM1MMM

[A-Z] 表示一个区间

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

let string = 'ABCedf1'
console.log(string.replace(/[A-Z]|[a-z]/g, '0'))
// 0000001

.

[\s\S] 匹配所有

\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行。

let string = `a b c d
e f 1 *`
console.log(string.replace(/[\s\S]/g, '0'))
// 000000000000000

\w 匹配字母、数字、下划线

等价于 [A-Za-z0-9_]

let string = `a b c d _
e f 1 *`
console.log(string.replace(/[\s\S]/g, '1'))
// 11111111111111111

非打印字符

非打印字符也可以是正则表达式的组成部分。

\cx

匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\f

匹配一个换页符。等价于 \x0c 和 \cL。

\n

匹配一个换行符。等价于 \x0a 和 \cJ。

\r

匹配一个回车符。等价于 \x0d 和 \cM。

\t

匹配一个制表符。等价于 \x09 和 \cI。

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK。

特殊字符

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

let string = 'a b c a'
console.log(string.replace(/a$/g, '2'))
// a b c 2

( ) 标记一个子表达式的开始和结束位置

标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。

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

let string = 'abc'
console.log(string.replace(/ab*/gim, '3'))
// 3c

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

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

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

匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \ . 。

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

要匹配 [,请使用 \ [。

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

例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}

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

例如, 'n' 匹配字符 'n'。'\ n' 匹配换行符。序列 '\ \ ' 匹配 "\ ",而 '\ (' 则匹配 "("。

^ 匹配输入字符串的开始位置

匹配输入字符串的开始位置, 除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合

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

要匹配 {,请使用 {。

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

要匹配 |,请使用 |。

限定符

{n} n 是一个非负整数

n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,} n 是一个非负整数。

至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m} m 和 n 均为非负整数,其中n <= m。

。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

定位符

\b 匹配一个单词边界,即字与空格间的位置。

let string = 'abcab ab'
console.log(string.replace(/\bab/g, '34'))
// 34cab 34

\B 非单词边界匹配。

let string = 'abcab ab'
console.log(string.replace(/\Bab/g, '34'))
// abc34 ab

修饰符

i ignore - 不区分大小写

将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。

g global - 全局匹配

查找所有的匹配项。

m multi line - 多行匹配

使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。

s 特殊字符圆点 . 中包含换行符 \n

默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

元字符

元字符的元素与语法中的多数相似,因此只写那些不同的。

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

例如,'n' 匹配字符 "n"'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

x|y 匹配 x 或 y

\d 匹配一个数字字符

等价于 [0-9]

\D 匹配一个非数字字符

等价于 [^0-9]。

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

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

\xn 匹配 n,其中 n 为十六进制转义值

十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。

\num 匹配 num,其中 num 是一个正整数。

对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。

\nm 标识一个八进制转义值或一个向后引用

如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。

\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。

\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。

例如, \u00A9 匹配版权符号 (?)

运算符优先级

  1. 正则表达式从左到右进行计算,并遵循优先级顺序
  2. 相同优先级的从左到右进行运算,不同优先级的运算先高后低。

\ 转义符

(), (?:), (?=), [] 圆括号和方括号

*, +, ?, {n}, {n,}, {n,m} 限定符

^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序) |

| 替换,"或"操作

字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

?=、?<=、?!、?<! 的使用区别

x(?=y) 查找 y前边的x

let string = 'abc'
console.log(string.replace(/a(?=b)/g, '5'))
// 5bc

(?<=y)x 查找y后边的x

let string = 'abac'
console.log(string.replace(/(?<=b)a/g, '5'))
// ab5c

x(?!y) 查找后面不是 y 的 x

let string = 'abac'
console.log(string.replace(/a(?!b)/g, '5'))
// ab5c

(?<!y)x 查找前面不是 y 的 x。

let string = 'abac'
console.log(string.replace(/(?<!b)a/g, '5'))
// 5bac

总结

正则表达一般是平时不咋注意,用的时候特别头疼,这是我的感觉。 所以照着文档,写了一遍,有的自己也实验了一遍,有不对的地方,还请多多指导,欢迎点赞,留言!!!