【博学谷学习记录】超强总结,用心分享 | 正则表达式总结
【博学谷IT技术支持】
常用表达式
手机号校验
校验规则使用了^ [] \d {} $,分别代表着
- 排除1以外的其他数字
- [3-9]这个区间内的数字
- \d 匹配数字字符
- {3,9}第三位起,替换9位数字
- $ 起结束作用
假设你没有写最后$,即使超出位数,依然为true
let phone = /^1[3-9]\d{3,9}$/
console.log(phone.test(手机号))
// true
邮箱校验
- [1]第一位开头必须是大小写字母或数字
-
- 起和第二位拼接的左右
- \w 第二位起就比较随意,数字,字母,下划线都成
- @ 拼接@符号
- 最后的是一个整体,分前部分数字,字母加.和后半部分数字,字母
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 匹配版权符号 (?)
运算符优先级
- 正则表达式从左到右进行计算,并遵循优先级顺序
- 相同优先级的从左到右进行运算,不同优先级的运算先高后低。
\ 转义符
(), (?😃, (?=), [] 圆括号和方括号
*, +, ?, {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
总结
正则表达一般是平时不咋注意,用的时候特别头疼,这是我的感觉。 所以照着文档,写了一遍,有的自己也实验了一遍,有不对的地方,还请多多指导,欢迎点赞,留言!!!
a-zA-Z0-9 ↩︎