前文
转义字符 \
- 如果普通字符串本身是双引号,那么字符串中就不能存在多的一个双引号,只能使用单引号代替
- 如果在字符串中存在",那么转义字符串后面的东西就会强制转换成文本
let str = "123"456"
- 如果想字符串本身上存在 \ ,那么就需要再使用转义符号转义 \, 因为\本身意义就是转义的,所以不能单独使用
let str = "123\456"
转义字符串换行 \n
let str = "1\n1"
结束符/r
- 正常电脑按一个回车键,在系统的底层识别的就是\r\n,linux系统中回车只有\n
let str = '11212\r'
缩进 \t
let str = '1111\t111'
正则表达式创建
正则表达式字面量 RegExp
构造创建
- let reg = new RegExp('内容')
正则表达式测试方法.test() 返回布尔值
let reg = /abc/
reg.test("abcd")
String.match在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
- 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置
修饰符
i : ignoreCase 忽略大小写
let str = /abc/
str.test('ABC')
let str = /abc/i
str.test('ABC')
g :global 所有的
// 查找str中是否存在多个abc
let reg = /abc/g
let str = 'abcabcabc'
str.match(reg) // ['abc', 'abc', 'abc']
^ : 以固定格式开头
let reg = /^a/g
let str = 'abca'
str.match(reg)
m :多行匹配
let reg = /^a/gm
let str = 'abc\na'
str.match(reg)
语法[]方括号表达式
[]方括号表达式介绍
-
- /[1234567890]/
- 匹配是否存在一位取值范围0-9的数字
-
- /[1234567890]/.test('1') true
- /[1234567890]/.test('a') false
let reg = /[1234567890][1234567890][1234567890]/g
let str = '1234jj235'
str.match(reg)
let reg = /[ab][cd][d]/g
let str = 'abcd'
str.match(reg)
// 创建一全局匹配0-9或A-z+cd+d三个数字或字母相连的正则
let reg = /[0-9A-z][cd][d]/g
let str = '1cd2ddAAA'
str.match(reg) // ['1cd', '2dd']
[]方括号中的^代表非
-
- /[^a][b][c]/
- 代表第一位除了a都可以第二位则是b第三位则是c相连的字母
let reg = /[^a][b][c]/g
let str = 'abcbbcAbc'
str.match(reg) // [bbc,Abc]
()圆括号表达式
- 只使用()相当于数学中的()优先计算:
- 还有一个意思是子表达式下面会介绍
let reg = /(a)/g
let str = 'abcbbcAbc'
str.match(reg) // [a]
let reg = /(a)[b]/g
let str = 'abcbbcAbc'
str.match(reg) // ['ab']
()圆括号中的 | 或
let reg = /(abc|bcd)/g
reg.test('abc')
reg.test('bcd')
reg.test('bddd')
let reg = /(abc|bcd)[0-9]/g
reg.test('abc1')
reg.test('bcdA')
元字符
\w:world 代表一位 == [0-9A-z_]
let reg = /\wcd/g
let str = '1dccd'
str.match(reg)
\W:代表一位和\w相反 == [^\w]
let reg = /\Wdc/g
let str = '1dccd*dc'
str.match(reg)
\d:代表一位[0-9]
let reg = /\d\wde/g
let str = '00de0ede00ed'
str.match(reg)
\D:代表一位和\d相反 == [^0-9]
let reg = /\D\wde/g
let str = '00deede00ed'
str.match(reg)
表达式中也可以使用元字符
let reg = /[\w]/g
let str = '123asd'
str.match(reg)
let reg = /[\w][\W][\d][\D]/g
let str = '0*1S0000'
str.match(reg)
\s :代表一位任何空白字符,包括空格、制表符、换页符等等。==[ \f\n\r\t\v]
let reg = /\s/g
let str = '\r123 \n'
str.match(reg)
'\r b \n'.replace(/\s/g, '')
\S : 代表一位任何非空白字符。等价于 [^ \s]
// 创建一个全局匹配没有空白字符的字符串
let reg = /\S/g
let str = '\r123 \n'
str.match(reg) // ['1', '2', '3']
\b :代表一位 单词边界 也就是指单词和空格间的位置。
- 例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
let reg = /\ber\b/g
let str = 'eredsd ersdfsdf'
str.match(reg)
let reg = /\ber\b/g
let str = 'eredsd er sdfsdf'
str.match(reg)
\B : 代表一位 非单词边界
let reg = /\ber\B/g
let str = 'eredsd ersdfsdf'
str.match(reg)
let reg = /\Bed\b/g
let str = 'eredsded sdfsdf'
str.match(reg)
. :代表一位 == [^\r\n]
let reg = /./g
let str = '\rn\n 12233'
str.match(reg) //['n', ' ', '1', '2', '2', '3', '3']
量词:n可以代表任何东西
n+ : 匹配任何包含出现1次至无数次的字符串 {1, Infinity(正无穷)}
// 创建一个全局[0-9A-z_]之间的一位可以出现1次到无数次
let reg = /\w+/g
let str = 'abc'
str.match(reg) // [abc]
let reg = /\w+/g
let str = 'aaaaaaaaaaaaabbbccc'
str.match(reg) // ['aaaaaaaaaaaaabbbccc']
n* : 匹配任何包含出现0次至无数次的字符串 {0, Infinity(正无穷)}
// 创建一个全局[0-9A-z_]之间的一位可以出现0次到无数次
let reg = /\w*/g
let str = 'abc'
str.match(reg) // ['abc', '']
- 为什么会有空串的存在?
- 的查找规则先查看abc符不符合要求,如果符合要求此时就是3
- 然后会/g全局匹配,*可以匹配0个或多个
- abc中的c后面还存在空,所以查找的时候会查找一个空串出来
// 创建一个全局匹配[0-9]之间的一位可以出现0次到无数次
let reg = /\d*/g
let str = 'abc'
str.match(reg) // ["","","",""]
n? :匹配任何包含0次或1次的字符串 {0,1}
// 创建一个全局[0-9A-z_]之间的一位可以出现0次到1次
let reg = /\w?/g
let str = '111a'
str.match(reg) // ['1', '1', '1', 'a', '']
n{x} :匹配包含x个n的序列的字符串 x可以自定义 {x}
let reg = /\d{11}/g
let str = '18211896634'
str.match(reg)
let reg = /\d{11}/g
let str = '182a11896634'
str.match(reg)
/\d{11}/.test('18211896634')
n{x,y} :匹配包含x个到y个的字符串,x,y可以自定义{x,y}
- 匹配规则
- 首先根据贪婪匹配原则匹配,如果没有达到y的长度,则自己缩短到最小x的数
let reg = /\d{3,5}/g
let str = '123451234'
str.match(reg)
let reg = /\d{3,5}/g
let str = '123451'
str.match(reg)
- 如果没有设置y的话则默认y为正无穷 {0, Infinity(正无穷)}
let reg = /\d{3,}/g
let str = '123451'
str.match(reg)
n$ :匹配结尾必须为n的字符串
// 创建一个全局匹配必须为[0-9]之间结尾的数字
/\d$/.test('1111A') //false
/\d$/.test('AAAAA1') //true
^n :匹配开头必须为n的字符串
// 创建一个全局匹配必须为[0-9]之间开头的数字
/^\d/g.test('1111A') //true
/^\d/g.test('AAAAA1') //false
// 以数字开头,以数字结尾
/^\d$/g.test('1')
// 因为查找的是一位,开头和结尾必须是一位0-9之间的数字
/^\d$/g.test('11111') // false
// 创建一个以数字开头长度为11位并且结尾是数字
/^\d{11}$/.test('18211076614')
正向预查 正向断言
(?=n ) 匹配任何其后紧接指定字符串n的字符串
// 创建一个全局匹配a后面必须是b的正则
let reg = /a(?=b)/g
let str = 'abcdab'
str.match(reg) // ['a', 'a']
// 创建一个全局匹配以a开头并且a后面必须是b的正则
let reg = /^a(?=b)/g
let str = 'abcdab'
str.match(reg) // ['a']
(?!n) 匹配任何其后没有紧接指定字符串n的字符串
let reg = /a(?!b)/g
let str = 'abacab'
str.match(reg)
()子表达式
- 正常情况下只写()没什么用也不会影响
- 但是在特殊情况下会有不同的意思
- /(a)/ 当使用括号括起表达式的时候,括号会记录里面的匹配内容,可以利用反向引用引用出来 \1
- /(a)\1/ 反向引用第一个字表达式中的内容,一个括号()代表一个表达式
- /(a)\1/ 正则解释:匹配第一位是a,第二位也是和第一位相同的字符串,也就是a
- /(\w)\1/ :正则解释:第一位匹配规则中匹配到的字符串,第二位也会查找第一位匹配到的相同字符串
- /(\w)\1\1\1/ : 三次引用第一个表达式中的内容
-
- 例如:/(\w)\1\1\1/ :第一位符合条件的是A,第二、三、四位必须也是相同的A
let reg = /(\w)\1\1\1/g
let str = 'aaaabbbccccabcd'
str.match(reg)
// 创建一个匹配AABB类型的字符串
let reg = /(\w)\1(\w)\2/g
let str = 'aabbccddabcdcccc'
str.match(reg) // ['aabb', 'ccdd', 'cccc']
正则表达式方法
exec()匹配方法,返回一个类数组
let reg = /ab/g
let str = 'abbaabab'
console.log(reg.exec(str))
//['ab', index: 0, input: 'abababab', groups: undefined]
- 第一次执行exec方法返回的index代表指向的第一个匹配正确字符串的指针索引
- 第二次执行如果匹配成功指针则指向第二个匹配正确字符串的指针索引
- 如果没有匹配成功则返回null,返回null之后再次执行exec方法则会从第一条开始
let reg = /ab/g
let str = 'abbaabab'
console.log(reg.exec(str))
console.log(reg.lastIndex)
console.log(reg.exec(str))
console.log(reg.exec(str))
console.log(reg.exec(str))
console.log(reg.exec(str))
console.log(reg.exec(str))
LastIndex 返回exec方法中的index
let reg = /ab/g
let str = 'abbaabab'
console.log(reg.lastIndex)
console.log(reg.exec(str))
let reg = /ab/g
let str = 'abbaabab'
console.log(reg.exec(str))
reg.lastIndex = 0;
console.log(reg.exec(str))
// 创建一个匹配AABB类型的字符串
let reg = /(\w)\1(\w)\2/g
let str = 'aabbccddabcdcccc'
reg.exec(str) // ['aabb', 'a', 'b', index: 0, input: 'aabbccddabcdcccc', groups: undefined]
reg.exec(str) // ['ccdd', 'c', 'd', index: 4, input: 'aabbccddabcdcccc', groups: undefined]
reg.exec(str) // ['cccc', 'c', 'c', index: 12, input: 'aabbccddabcdcccc', groups: undefined]
练习题
检验一个字符串首或尾是否含有数字
let reg = /^\d|\d$/g
let str = '123bac'
str.match(reg)// ['1']
检验一个字符串首尾是否都含有数字
let reg = /^\d[\w\W]*\d$/g
let str = '12sdf*afaa1'
str.match(reg)
reg.test(str)
检验一个字符串头部是否包含指定数字并且以数字到11位结尾
/^(123|134)\d{8}$/.test('12345678901') // true
贪婪匹配
- 正则默认匹配方式为贪婪匹配,能多个匹配尽量匹配少的
- n{x, y} 能匹配y个尽量匹配y个,底线就是x个
let reg = /a{2,5}/g
let str = 'a12aaaaaaaaa'
str.match(reg)// ['aaaaa', 'aaaa']
?非贪婪匹配,打破贪婪匹配
// 创建一个n+量词
let reg = /a+?/g
let str = 'aaaaaaaa'
str.match(reg) // ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
// 创建一个最少3个最多5个的正则
let reg = /a{3,5}?/g
let str = 'aaaaaaaa'
str.match(reg)//['aaa', 'aaa']
// 创建一个n?量词 至少0次或多次
let reg = /a??/g
let str = 'aaaaaaa'
str.match(reg)// ['', '', '', '', '', '', '', '']