創(chuàng)建方式
// 用雙斜杠包裹
/[abc]/
// 用js內(nèi)置對象創(chuàng)建
let reg = new RegExp(/[0-9]*/)
// 用js內(nèi)置對象通過字符串創(chuàng)建
let reg = new RegExp('[0-9]*')
任意字符 .
let reg = /./
let str = '123'
console.log(str.match(reg)) //=> ['1', index: 0, input: '123', groups: undefined]
中括號:[]
let reg = /[0-9]/
let str = '123x'
str.match(reg) // => 1
否定字符集 [^abc]
// 查找下方文本的所有單詞(ber 和 bor 除外)
let reg = /(?:b[^abc]r)+/g
let str = 'bar ber bcr bor bbr'
console.log(str.match(reg)) => // ['ber', 'bor']
加號:+
- 表示匹配前面的表達式1次或者多次,匹配不到返回null
let reg = /[0-9]+/
let str = '123x'
str.match(reg) // => 123
let str2 = 'x'
str2.match(reg) // => null
星號:*
- 表示匹配前面的表達式0次或多次,匹配不到返回空字符串:''
let reg = /[0-9]*/
let str = '123x'
str.match(reg) // => 123
let str2 = 'x'
str2.match(reg) // => ['', index: 0, input: 'x', groups: undefined]
花括號:{n} {a,b}{c,}
- 表示匹配前面的表達式n次或a-b或至少出現(xiàn)c次,匹配不到返回null
let reg = /[0-9]{2}/
let str = '123x'
str.match(reg) // => 12
let reg = /[0-9]{2,3}/
let str = '123x'
str.match(reg) // => 123
let reg = /[0-9]{2,3}/
let str = '12xx'
str.match(reg) // => 12
let reg = /[0-9]{2,3}/
let str = 'xx'
str.match(reg) // => null
let reg = /[0-9]{2,}/
let str = '1'
str.match(reg) // => null
let reg = /[0-9]{2,}/
let str = '123'
str.match(reg) // => 123
匹配開頭:^
- 表示開頭必須以^后面的表達式開始,不匹配返回null
let reg = /^1/
let str = '123'
str.match(reg) // => 1
let reg = /^1/
let str = 'x123'
str.match(reg) // => null
匹配結(jié)尾:$
- 表示結(jié)尾必須以$前面的表達式開始,不匹配返回null
let reg = /1$/
let str = '121'
str.match(reg) // => 1
let reg = /1$/
let str = 'x123'
str.match(reg) // => null
匹配空格: \s
let reg = /\s/
// let reg = new RegExp('\\s') 注意轉(zhuǎn)義
// let reg = new RegExp(/\s/) 注意寫法
let str = '12 '
str.match(reg) // => [' ', index: 2, input: '12 ', groups: undefined]
匹配非空格: \S
let reg = /\S/
// let reg = new RegExp('\\S') 注意轉(zhuǎn)義
// let reg = new RegExp(/\S/) 注意寫法
let str = '12 '
str.match(reg) // => ['1', index: 0, input: '12 ', groups: undefined]
匹配任意字符
let reg = /[\s\S]/
let str = '12 '
str.match(reg) // => ['1', index: 0, input: '12 ', groups: undefined]
匹配單詞字符 \w: 字母、數(shù)字和下劃線
let reg = /\w/g
匹配非單詞字符 \W(大寫w): 字母、數(shù)字和下劃線
let reg = /\W/g
匹配數(shù)字字符\d
let reg = /\d/g
匹配非數(shù)字字符\D
let reg = /\D/g
匹配正整數(shù)
let reg = /^[1-9][0-9]*|[0]$/
分組()
- 匹配小數(shù)如1.0 0.1 .1 1. . 這幾個元素
- 技巧:可以將這四種情況依次的正則寫出來再通過| 合并
// 浮點數(shù)
let testArr = ["1","10",".1","1.","0","0.1","1.0",'.'];
let reg = /\.[0-9]+$|([1-9][0-9]*|[0])(\.[0-9]?)?$/;
console.log(
testArr.map(item=>{
let res = item.match(reg)
if(res) return res[0]
else return res
})) // => ['1', '10', '.1', '1.', '0', '0.1', '1.0', null]
exec
- 將正則匹配的結(jié)果依次輸出
- 使用exec在有幾個括號()的時候就會在括號()沒有匹配到內(nèi)容的時候返回undefined
- 在左括號后面加上 ?: 則可以消除undefined,如下面reg2所示
// 匹配浮點數(shù)與+-*空白符 并且用?:消除括號帶來的undefined
let s = '11.01+0.122- .3*4./5 '
let reg = /([1-9][0-9]*|[0])(\.([0-9]+)?)?|\.[0-9]+|\+|\-|\*|\/|\s+/g;
let res
while((res = reg.exec(s))){
console.log(res)// => 以加號的輸出結(jié)果為例: ['+', undefined, undefined, undefined, index: 5, input: '11.01+0.122- .3*4./5 ', groups: undefined]
}
let s = '11.01+0.122- .3*4./5 '
let reg2 = /(?:[1-9][0-9]*|[0])(?:\.(?:[0-9]+)?)?|\.[0-9]+|\+|\-|\*|\/|\s+/g;
let res
while((res = reg.exec(s))){
console.log(res) // => 以加號的輸出結(jié)果為例: ['+', index: 5, input: '11.01+0.122- .3*4./5 ', groups: undefined]
}
學(xué)習(xí)正則練習(xí)場