JS之正则表达式

接着开新坑,之前正则基本上是不会,想用啥直接google但毕竟不是个长久之计。所以第二篇我决定搞正则。、
参考资料有:MDN正则表达式部分阮一峰的 ECMAScript 6 入门、JavaScript高级程序设计 —— RegExp类型

创建正则表达式

正则表达式字面量

1
let re = /ab+c/

使用正则表达式字面量方法为正则表达式提供了脚本加载后的编译。当正则表达式保持不变时,使用此方法可获得更好的性能。

RegExp 对象的构造函数

1
let re = new RegExp('ab+c')

使用构造函数为正则表达式提供了运行时的编译。使用构造函数的方式,当你知道正则表达式的模式将会改变,或者不知道模式,并且从其他来源获取他(如:用户输入)

使用正则表达式

使用简单模式

简单模式是由你想直接找到的字符串构成. 如:/asd/ 这个模式能且只能匹配’asd’按照顺序同时出现的情况。

使用特殊字符串

断言

表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。

便边界

表示行和单词的开始和结尾

字符串类别

区分不同类型的字符串,例如区分字母和数字。

组和范围

表示表达式字符的分组和范围

量词

表示匹配的字符串或表达式的数量。

Unicode属性转义

基于 unicode 字符属性区分字符。例如大写和小写字母、数字符号和标点。

###正则表达式中的特殊字符

\

含义:在非特殊字符之前的反斜杠表示下个字符是特殊字符。在特殊字符之前的反斜杠表示下一个字符不是特殊字符,应该按照字面理解。如果你想将字符串传递给RegExp构造函数,不要忘记在字符串字面两种反斜杠是转义字符。所以为了在模式中添加一个反斜杠,需要在字符串字面量中转义它。

^

含义:匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
如:/^A/ 不会匹配’anA’,会匹配’Ana’

$

匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
如:/$A/ 会匹配’anA’,不会匹配’Ana’

*

匹配前一个表达式零次或多次。等价于{0,}。
/bo*/ 可以匹配 ‘booooo’、可以匹配 ‘bxxxxxxxxx’(不完全匹配 0次)、不匹配 ‘oooooox’(因为从b开始匹配,然而却没有b)所以不匹配。

+

匹配前面一个表达式一次或者多次。等价于{1,}。
如:/bo*/ 可以匹配 ‘booooo’、可以匹配 ‘bxxxxxxxxx’(不匹配)、不匹配 ‘oooooox’(因为从b开始匹配,然而却没有b)所以不匹配。

?

匹配前面一个表达式0次或者1次。等价于{0,1},如果**紧跟在任何量词 * + ? 或 {} 的后面将会使两次变成非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽量多的字符)正好相反。

. (小数点)

默认匹配除换行之外的任何单个字符。
如:/.n/将会匹配”nay, an apple is on the tree”中的’an’和’on’,但不会匹配’nay’(因为n之前没有字符)

(?:x)

匹配’x’但是不记住匹配项。这种括号叫做非捕获括号。是的你能够定义与正则表达式运算符一起使用的子表达式。

x(?=y)

匹配’x’仅仅当’x’后面跟着’y’。这种叫做先行断言。

(?<=y)x

匹配’x’仅仅当’x’前面是’y’。这种叫做后行断言。

x(?!y)

仅仅当’x’后面不跟着’y’时匹配’x’,这被称为正向否定查找。

(?<!y)x

仅仅当’x’前面不是’y’时匹配’x’,这被称为反向否定查找。

x|y

匹配’x’或者’y’

{n}

n是一个正整数,匹配前一个字符刚好出现了N次。

{n,}

n是一个正整数,匹配前一个字符至少出现了n次。

{n,m}

n,m都是整数。匹配前面的支付至少n次,最多m次。如果n或者m的值是0,这个值将被忽略。

[xyz]

一个字符集合。匹配方括号中的任意字符,包括转译序列。也可以用使用 - (破折号)来指定一个字符范围。
如:[abcde] = [a-e] 他们都匹配‘brisket’中的‘b’,也都匹配‘city’中的‘c’。

[^xyz]

一个反向字符集。也就是说,它匹配任何没有包含在方括号中的字符。在这里也能使用 - (破折号)来指定一个字符范围。

[\b]

匹配一个退格(U+0008)

\b

匹配一个字符边界。一个词的边界就是一个次不被另一个“字”跟随(前面或者后面存不存在字符)
如:‘moon’ /\bm/匹配‘moon’中的‘m’ 、 /oo\b/不匹配‘moon’中的‘m’、/oon\b/匹配‘moon’中的‘oon’ 因为‘oon’是这个字符串的结束部分,这样他没有被一个”字”紧跟着

\B

匹配一个非单词边界

  • 字符串第一个字符为非”字”字符
  • 字符串最后一个字符为非“字”字符
  • 两个单词字符之间
  • 两个非单词之间
  • 两个非单词字符之间
  • 空字符串
    如:/\B../匹配‘nond0ay’中的‘on’,而/y\B../匹配“possibly yesterday”中的“yes”

/cX

当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。
如:/\cM/ 匹配字符串中的control(键盘)+M

\d

匹配一个数字。等价于[0-9]
/\d/与/[0-9]/匹配“B2 is the suite number”中的2

\D

匹配非数字字符。等价于[^0-9]
/\D/与/[0-9]/匹配“B2 is the suite number”中的B

\f

匹配一个换页符(U+000C)

\n

匹配一个换行符(U+000A)

\r

匹配一个回车符(U+000D)

\s

匹配一个空白字符。包括空格、制表符、换页符、和换行符。

\S

匹配一个非空白字符。

\w

匹配一个单字字符(数字、字母、下划线)等价于[A-Za-z0-9_]

\W

匹配一个非单字字符(数字、字母、下划线)等价于[^A-Za-z0-9_]

\n

在正则表达式中,他返回最后的第n个字捕获匹配的字符串
如:/apple(,)\sorange\1/ 匹配”apple, orange, cherry, peach.”中的’apple, orange,’ 。

使用正则表达式

正则表达式可以被用于RegExp的exec和test方法以及String的match、replace、search和split方法。

exec

一个在字符串执行查找匹配的RegExp方法,他返回一个数组(未匹配到则返回null)

1
2
let reg = /[^A-Za-z0-9_]/
console.log(reg.exec('50%'))

test

一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false

1
2
let reg = /[^A-Za-z0-9_]/
console.log(reg.test('50%'))

match

在一个字符串中执行查找匹配的String方法,它返回一个一个数组,在未匹配到时候返回null。

1
2
let reg = /[^A-Za-z0-9_]/
console.log('50%'.match(reg))

matchAll

1
2
3
4
5
6
7
const regexp = RegExp('foo*','g'); 
const str = 'table football, foosball';
let matches = str.matchAll(regexp);

for (const match of matches) {
console.log(match);
}

一个在字符串中测试匹配的String方法,他返回匹配到的位置索引,或者在失败时返回-1.

1
2
3
let text = 'dsad dff deeq xccc jj ww~ @ # 004'
let regex = /[^\D]/g
console.log(text.search(regex))

replace

一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。

1
2
3
let text = 'dsad dff deeq xccc jj ww~ @ # 004'
let regex = /[^\D]/g
console.log(text.replace(regex, 'gogogo'))

(此处存在一个疑问)[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/search]

split

一个使用正则表达式或者一个固定字符串分割一个字符串,并且将分割后的子字符串存储到数组中的String方法。

1
2
3
let text = 'dsad dff deeq xccc jj ww~ @ # 004'
let words = text.split(' ')
console.log(words[2])

正则表达式标志

g

全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。

i

不区分大小写搜索

m

多行搜索

s

允许.匹配换行符

u

使用unicode码的模式进行匹配。Unicode 模式 用来处理大于\uFFFF的Unicode字符。也就是说会正确处理四个字节的 UTF-16 编码。

y

执行”粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。与 g 的不同 g修饰符只要剩余位置中存在匹配就可以,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的含义。

1
2
3
4
5
6
7
let s ='aaa_aa_a'
let reg1 = /a+/g
let reg2 = /a+/y
reg1.exec(s) // 'aaa'
reg2.exec(s) // 'aaa'
reg.exec(s) // aa
reg.exec(s) // null 因为剩余的第一位是 _ 所以不匹配。

感谢您的阅读。 🙏