正则表达式

208 阅读1分钟

书写形式

new RegExp(正在表达式, 匹配模式)
const reg = new RegExp('a', 'i')

/正在表达式/匹配模式
const reg = /a/i
reg.test('asd')

匹配模式

i 忽略大小写
g 全局匹配
ig 或者 gi

正则

a|b、[ab] // a或b

abc|asd // abc或者asd

[a-z] // 小写a到z
[A-Z] // 大写A到Z

[0-9] // 0到9

[^0-9] // 除了数字

/aaaaaa/、/a{6}/ // {n}出现n次、{m,n}m次到n次、{m,}m次以上
/ababab/、/(ab){3}/

/asd+/ // + 至少一次,相当于/asd{1,}/
/(asd)+/ // 相当于/(asd){1,}/

/as*d/ // * 有没有都可以,相当于/as{0,}d/

/as?d/ // ? 0个或1个,相当于/as{0,1}d/

/^a/ // 以a开头

/a$/ // 以a结尾

/./ // .点表示任意字符

/\./、/\\/ // 单纯的点和\需要转义字符
/\./ => new RegExp('\\.')
/\\/ => new RegExp('\\\\')

/\w/ // \w任意字母、数字、_ 相当于[A-Za-z0-9_]

/\W/ // \W除了字母、数字、_ 相当于[^A-Za-z0-9_]

/\d/ // \d任意的数字 相当于[0-9]

/\D/ // \D除了数字 相当于[^0-9]

/\s/ // \s空格

/\S/ // \S除了空格

/\bchild\b/ // \b单词边界

/\Bchild\B/ // \B除了单词边界

exec方法

获取字符串中符合正则表达式的内容,返回一个数组或者null

const reg = /a[a-z]c/g
let result = reg.exec('abcaccadcaec')

while(result) {
    console.log(result)
    result = reg.exec('abcaccadcaec')
}

['abc', index: 0, input: 'abcaccadcaec', groups: undefined]
['acc', index: 3, input: 'abcaccadcaec', groups: undefined]
['adc', index: 6, input: 'abcaccadcaec', groups: undefined]
['aec', index: 9, input: 'abcaccadcaec', groups: undefined]


const reg = /a(([a-z])c)/g
let result = reg.exec('abcaccadcaec')

while(result) {
    console.log(result)
    result = reg.exec('abcaccadcaec')
}

['abc', 'bc', 'b', index: 0, input: 'abcaccadcaec', groups: undefined]
['acc', 'cc', 'c', index: 3, input: 'abcaccadcaec', groups: undefined]
['adc', 'dc', 'd', index: 6, input: 'abcaccadcaec', groups: undefined]
['aec', 'ec', 'e', index: 9, input: 'abcaccadcaec', groups: undefined]


const reg = /a[a-z]c/g
let result = reg.exec('abcaccadcaec')
const fallback = []

while(result) {
    fallback.push(result[0])
    result = reg.exec('abcaccadcaec')
}

console.log(fallback)
['abc', 'acc', 'adc', 'aec']

split

字符串.split(正则表达式),返回一个数组

var str = "孙悟空abc猪八戒adc沙和尚"
var result = str.split(/[a-z]+/)
console.log(result)
['孙悟空', '猪八戒', '沙和尚']

search

字符串.search(正则表达式),返回一个数字

var str = "孙悟空abc猪八戒adc沙和尚"
var result = str.search(/[a-z]+/)
console.log(result)
3

replace

字符串.replace(正则表达式, 替换成什么内容),返回字符串

var str = "孙悟空abc猪八戒adc沙和尚"
var result = str.replace(/[a-z]+/g, 'xxx')
console.log(result) // '孙悟空xxx猪八戒xxx沙和尚'

const _name = "./login.js".replace(/^\.\/(.*)\.\w+$/, "$1");
const _phone = "19922220792".replace(/^(\d{3})\d{4}(\d{4})$/, `$1${"*".repeat(4)}$2`);
console.log(_name); // login
console.log(_phone); // 199****0792


match

字符串.match(正则表达式),返回一个数组或者null

var str = "孙悟空abc猪八戒adc沙和尚"
var reault = str.match(/[a-z]+/g)
console.log(result)
['abc', 'adc']

matchAll

字符串.matchAll(/正则表达式/g),返回一个迭代器RegExpStringIterator {}

注意:正则表达式必须加全局g,不然报错

var str = "孙悟空abc猪八戒adc沙和尚"
var arr = str.matchAll(/[a-z]+/g)

注意:迭代器,一般用for of 来看里面的值

for(let item of arr) {
    console.log(item)
}

['abc', index: 3, input: '孙悟空abc猪八戒adc沙和尚', groups: undefined]
['adc', index: 9, input: '孙悟空abc猪八戒adc沙和尚', groups: undefined]

var str = "孙悟空abc猪八戒adc沙和尚"
var arr = str.matchAll(/([a-z])+/g)

for(let item of arr) {
    console.log(item)
}

['abc', 'c', index: 3, input: '孙悟空abc猪八戒adc沙和尚', groups: undefined]
['adc', 'c', index: 9, input: '孙悟空abc猪八戒adc沙和尚', groups: undefined]

// mathAll和exec方法相似

常用正则表达式

去掉开头和结尾的空格

// 开头
/^\s*/

// 结尾
/\s*$/

// 开头和结尾
/^\s*|\s*$/g

手机号

/^1[3-9][0-9]{9}$/

邮箱

/^([A-z0-9_\-\.])+@([A-z0-9])+\.([A-z]{2,4})$/

小数

/^[-+]?\d+\.\d+$/

整数

/^\d+$/

不定期更新