無.Flac's Blog

無.Flac

JavaScript - 正则表达式

2025-01-07

正则表达式是一种强大的文本处理工具,用于匹配字符串中的特定模式。在 JavaScript 中,正则表达式被广泛用于字符串的搜索、替换、验证等操作。


正则表达式

>简介

  • 正则表达式用来定义一个规则

  • 通过这个规则计算机可以检查一个字符串是否符合规则,或者将字符串中符合规则的内容提取出来。

  • 正则表达式也是JS中的一个对象,所以要使用正则表达式,需要先创建正则表达式的对象。

创建 new RegExp()

 // new RegExp() 可以接收两个参数(字符串) 1.正则表达式 2.匹配模式
let reg = new RegExp("a", "i") // 通过构造函数来创建一个正则表达式的对象
let reg = /a/i

let reg = new RegExp("a", "i")let reg = /a/i 这两行代码定义了一个正则表达式 reg,它匹配字母 "a",并且忽略大小写(由于使用了 "i" 标志)。

字面量 xx = /?/

// 使用字面量来创建正则表达式:/正则/匹配模式
let reg = /\w/

let reg = /\w/ 这行代码将 reg 重新定义为匹配任何字母、数字或下划线的正则表达式(\w 是一个字符类)。

let reg = new RegExp("\\w")
    reg = new RegExp("a") // /a/ 表示,检查一个字符串中是否有a

reg = new RegExp("\\w") 这行代码将 reg 重新定义为匹配任何字母、数字或下划线的正则表达式。在 JavaScript 中,字符串中的反斜杠是一个转义字符,所以我们需要使用两个反斜杠 \\ 来表示一个实际的反斜杠。因此,"\\w" 在正则表达式中表示 \w,它是一个字符类,匹配任何字母、数字或下划线。

reg = new RegExp("a") 这行代码将 reg 重新定义为匹配字母 "a" 的正则表达式。

// 通过正则表达式检查一个字符串是否符合规则
let str = "a"

let result = reg.test(str) // true

    result = reg.test("b") // false
    result = reg.test("abc") // true
    result = reg.test("bcabc") // true

    reg = /a/
    console.log(result);

let str = "a" 这行代码定义了一个字符串 str,内容为 "a"。

let result = reg.test(str) 这行代码使用正则表达式 reg 测试字符串 str,并将结果存储在 result 中。由于 reg 最后被定义为匹配 "a",所以 resulttrue

result = reg.test("b") 这行代码测试字符串 "b",由于 "b" 不匹配 "a",所以 resultfalse

result = reg.test("abc") 这行代码测试字符串 "abc",由于字符串中包含 "a",所以 resulttrue

result = reg.test("bcabc") 这行代码测试字符串 "bcabc",由于字符串中包含 "a",所以 resulttrue

reg = /a/ 这行代码将 reg 重新定义为匹配字母 "a" 的正则表达式。

console.log(result) 这行代码输出 result 的值。由于前面的测试结果是 true,所以控制台将输出 true

>语法

大部分字符都可以直接写

let re = /ab/
let result = re.test('abc')

| 在正则表达式中表示或

let re = /abc|bcd/
let result = re.test('c') //false

[] 表示或(字符集)

  • [a-z] 任意的小写字母

  • [A-Z] 任意的大写字母

  • [a-zA-Z] 任意的字母

  • [0-9]任意数字

let re = /[ab]/ 
    re = /[a-z]/i    //匹配模式i 表示忽略大小写
let result = re.test('c') //false
let result = re.test('a') //true

[^] 表示除了

  • [^x] 除了x

let re = /[^a-z]/   //匹配包含小写字母以外内容的字符串
let result = re.test('c') //false
let result = re.test('aH') //true

. 表示除了换行外的任意字符

let re = /./ 
let result = re.test('aH') //true

在正则表达式中使用\作为转义字符

let re = /\./   //表示只匹配.
let result = re.test('c') //false

其他的字符集

  • \w 任意的单词字符 [A-Za-z0-9_]

  • \W 除了单词字符 [^A-Za-z0-9_]

  • \d 任意数字 [0-9]

  • \D 除了数字 [^0-9]

  • \s 空格

  • \S 除了空格

  • \b 单词边界

  • \B 除了单词边界

开头和结尾

  • ^ 表示字符串的开头

    let re = /^a/   //表示匹配开始位置的a
    let result = re.test('c') //false
  • $ 表示字符串的结尾

    let re = /a$/   //表示匹配结束位置的a
        re = /^a$/ //完全匹配,只匹配字母a,要求字符串必须和正则完全一致
    let result = re.test('a') //true
    console.log(result)

>量词

{m} 正好m个

let re = /a{3}/ 
    re = /^ab{3}$/ //实际上匹配的是 abbb
    re = /^(ab){3}$/
let result = re.test("aaa") // true

{m,} 正少m个

let re = /^(ab){1,}$/ 

{m,n} 正少m-n个

let re = /^(ab){1,3}$/ 

+ 一个以上,相当于{1,}

let re = /^ba+$/ 

* 任意数量

let re = /^ba*$/ 

? 0-1次,相当于{0,1}

let re = /^ba?$/ 

>exec方法

获取字符串中符合正则表达式的内容

g表示全局匹配

let str = "abcaecafcacc"

// 提取出str中符合axc格式的内容

// g表示全局匹配
let re = /a(([a-z])c)/ig

let result = re.exec(str)

//    console.log(result)

while(result){
    console.log(result[0], result[1], result[2])
    result = re.exec(str)
}

小练习

/* 
    dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd

    用自己的语言来把描述出来
        1    3         501789087
        1    3到9之间   任意数字 x 9

*/

let re = /1[3-9]\d{9}/g

re = /(1[3-9]\d)\d{4}(\d{4})/g

let str =
    "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd"

let result

while (result = re.exec(str)) {
    // console.log(result[0], result[1], result[2])
    console.log(result[1] + "****" + result[2])
}


re = /^1[3-9]\d{9}$/

console.log(re.test("13456789042"))

>字符串

split( ) 根据正则表达式对一个字符串拆分

let str = "孙悟空abc猪八戒abc沙和尚"
let result = str.split(/a[bc]c/)
console.log(result) // (3) ['孙悟空', '猪八戒', '沙和尚']

search( ) 搜索第一次在符合正则表达式的内容出现的位置

let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd"
let result = str.search(/1[3-9]\d{9}/)
console.log(result) // 6

replace( ) 根据正则表达式替换字符串中的指定内容

let result = str.replace(/1[3-9]\d{9}/g, "哈哈哈")

match( ) 根据正则表达式去匹配字符串中符合要求的内容

let str = "dajsdh13715678903jasdlakdkjg13457890657djashdjka13811678908sdadadasd"
let result = str.match(/1[3-9]\d{9}/g)
console.log(result) // (3) ['13715678903', '13457890657', '13811678908']

matchAll() 根据正则表达式去匹配字符串中符合要求的内容(必须设置g 全局匹配)

它返回的是一个迭代器

let result = str.matchAll(/1[3-9]\d{9}/g)
for(let item of result){
    console.log(item)
}

>垃圾回收

和生活一样,生活时间长了以后会产生生活垃圾。程序运行一段时间后也会产生垃圾。

在程序的世界中,什么是垃圾?

  • 如果一个对象没有任何的变量对其进行引用,那么这个对象就是一个垃

  • 垃圾对象的存在,会严重的影响程序的性能

  • 在JS中有自动的垃圾回收机制,这些垃圾对象会被解释器自动回收,我们无需手动处理

  • 对于垃圾回收来说,我们唯一能做的事情就是将不再使用的变量设置为null

let obj = {name:"孙悟空"}
let obj2 = obj

obj = null
obj2 = null