正则表达式

372 阅读4分钟

正则表达式创建

创建的两种方式

方法一

var reg = /pattern/

方法二

var reg = new RegExp('pattern');

注意!!!

正则表达式严格校验大小写

正则表达式方法

exec()

reg.exec(res) 如果能匹配到的话 返回一个array 未能匹配返回null

var reg = /abc/;
var str1 = 'abcdef';
var str2 = 'abdefg';
console.log(reg.exec(str1))//["abc", index: 0, input: "abcdef", groups: undefined]
console.log(reg.exec(str2))//null

text()

reg.test(res) 匹配成功返回true 匹配失败返回false

console.log(reg.test(str1))//true
console.log(reg.test(str2))//false

c{n}: n个连续的c

var reg = /c{2}/;
var str1 = 'abccde';
var str2 = 'abcdef';
console.log(reg.exec(str1))//[2]
console.log(reg.exec(str2))//null

c{m,n}: c{m,n}:连续的x个c (m<=x<=n)

var reg = /c{3,4}/;
var str1 = 'ascccdf';
var str2 = 'asccccfew';
console.log(reg.exec(str1))//[ccc]
console.log(reg.exec(str2))//[cccc]

c{m,}:连续的x个c (x>=m)

 var reg = /c{3,}/;
var str1 = 'abccde';
var str2 = 'abcccef';
var str3 = 'accccceqre'
console.log(reg.exec(str1))//null
console.log(reg.exec(str2))
console.log(reg.exec(str3))

c* :大于等于0个c 相当于{0,}

var reg = /c*/;
var str1 = 'abdef';
var str2 = 'ccccabcccfes';
console.log(reg.exec(str1))//[0]
console.log(reg.exec(str2))//[cccc]

c+:c+:大于等于1个连续的c

var reg = /c+/;
var str1 = 'abdef';
var str2 = 'abcccfes';
console.log(reg.exec(str1))//null
console.log(reg.exec(str2))/[ccc]

c?:大于等于0个小于等于1个c 满足0个就算成功,返回一个空字符串 c{0,1}

var reg = /c?/;
var str1 = 'bdef';
var str2 = 'abcfes';
console.log(reg.exec(str1))//[]
console.log(reg.exec(str2))//[]

?:非贪婪模式 尽可能少的匹配 c{m,n}?

c??:第一个?表示{0,1} 第二个?表示 非贪婪

^c:以c开头

var reg = /^c/;
var str1 = 'cabcdf';
var str2 = 'abcde';
console.log(reg.exec(str1))//[c]
console.log(reg.exec(str2))//null

c$:以c结尾

 var reg = /c$/;
var str1 = 'cabcdfc';
var str2 = 'abcde';
console.log(reg.exec(str1))//[c]
console.log(reg.exec(str2))//null

. : 除了换行符\n外的所有字符

//+ 多取
var reg = /.+/;
var str1 = 'cabcdfc';
var str2 = 'abc\nde';
console.log(reg.exec(str1))//[cabcdfc]
console.log(reg.exec(str2))//[abc]

a|b:匹配a或b

var reg = /a|b/;
var str1 = 'cabcdfc';
var str2 = 'abcde';
console.log(reg.exec(str1))
console.log(reg.exec(str2))

先判断括号内

var reg = /^(a|b).+/;
var str1 = 'cabcdfc';
var str2 = 'abcde';
console.log(reg.exec(str1))//null
console.log(reg.exec(str2))//[abcde]

字符集合[abc]:表示a或b或c任意一个字符

var reg = /^[abc]/;
var str1 = 'cabcdfc';
var str2 = 'abcde';
var str3 = 'desasd'
console.log(reg.exec(str1))//[c]
console.log(reg.exec(str2))//[a]
console.log(reg.exec(str3))//null

[a-z]小写字母 [A-Z]大写字母 [0-9]数字 [A-z] 所有字母 [a-zA-Z0-9]字母数字

var reg = /^[a-zA-Z0-9].+/;
var str1 = 'hello00'
var str2 = '00aaa'
console.log(reg.exec(str1))//[hello00]
console.log(reg.exec(str2))//[00aaa]

反字符集合[^abc]:除a或b或c以外的字符

^ [a-z]:以小写字母开头 [^a-z]:除小写字母外的字符

^ 在字符中表示非

^ [A-z] 非字母

 var reg = /^[^a-z]+/;//^[a-z]:以小写字母开头 [^a-z]:除小写字母外的字符
var str1 = 'hello'
var str2 = 'HELLO'
console.log(reg.exec(str1))//null
console.log(reg.exec(str2))//[HELLO]

\b: 匹配字符的边界 \B:非边界

var reg1 = /\bc/;
var reg2 = /c\b/
var str1 = 'cello'
var str2 = 'abbwdc'
var str3 = 'acd'
console.log(reg1.exec(str1))//[c]
console.log(reg2.exec(str2))//[c]
console.log(re1.exec(str3))//null

\d:匹配数字 \D:匹配非数字

var reg1 = /\d/;
var reg2 = /\D/
var str1 = '23123'
var str2 = 'as2313'
console.log(reg1.exec(str1))//[2]
console.log(reg2.exec(str2))//[a]

\n:换行 \s:匹配单个空格 \S: 匹配非空格字符

var reg = /\s.+/
var str = 'This is a test String'
console.log(reg.exec(str))//[" is a test String"]

\w:单词字符 相当于字符集和[a-zA-Z0-9_ ]

\W:非单词字符 相当于[…^a-zA-Z0-9_ ]

var reg = /\w.+/
var str = '_abc123'
console.log(reg.exec(str))//['_abc123']
 var reg = /(\w)(\w)/
var str = 'blueidea'
console.log(reg.exec(str))//["bl", "b", "l"]
var reg = /(\w)\1///相当于/bb/
var str1 = 'blueidea'
var str2 = 'bblueidea'
console.log(reg.exec(str1))//null
console.log(reg.exec(str2))['bb','b']

?:表示避免子表达式括号内的匹配结果

var reg1 = /^(?:b|c).+/;
var reg2 = /^(b|c).+/;
var str = 'bbs.blueidea.com'
console.log(reg1.exec(str))//[]
console.log(reg2.exec(str))//[b]

(?=) :表示要匹配的字符串 必须紧跟 等号后为限定条件

var reg = /cainiao(?=8)/
var str1 = 'cainiao8'
var str2 = 'cainiao9'
console.log(reg.exec(str1))//cainiao
console.log(reg.exec(str2))//null

(?!pattern):后面不能紧跟某个pattern

var reg = /hello(?!world)/
var str = 'helloworld'
console.log(reg.exec(str))//null

匹配元字符: *,+,?,....

c* 代表大于等于0个c 'c*' 匹配c*

如果想匹配'c*'

var reg = /c\*/
var str = 'abc*'
console.log(reg.exec(str))//c*

全局匹配,修饰符 g 执行后更改lastIndex属性值

var reg = /b/g
var str = 'bbs.blueidea.com'
console.log(reg.lastIndex)//0
console.log(reg.exec(str))
console.log(reg.lastIndex)//1
console.log(reg.exec(str))
    

不区分大小写,修饰符 i

var reg1 = /c/i
var reg2 = /c/
var str = 'abC'
console.log(reg1.exec(str))//C
console.log(reg2.exec(str))//null

支持正则表达式的String方法 search():返回索引

var str = 'hello world';
console.log(str.search(/world/))//6
console.log(str.search(/World/))//-1 未找到返回-1

match():返回值

var str = 'hello world';
console.log(str.match(/world/))//world
console.log(str.match(/World/))//null
console.log(str.match('e'))//e

replace():代替

var str = 'hello world';
console.log(str.replace(/world/,'friend'))//hellow friend

split():用字符分开

var str = 'hello world';
console.log(str.split(/\s+/))// ["hello", "world"]

正则表达式小练习

匹配手机号

13... 14... 15... 17... 18... 11位

var reg1 = /^1[34578]\d{9}$/
var reg2 = /^(13|14|15|16|18)\d{9}$/
var reg3 = /^1[34578][0-9]{9}$/

匹配电子邮箱

xxxxx@xx.nnn x可以是字母数字'_','.','-' nnn 字母

var  reg = /^[\w._-]+\@[a-zA-Z0-9._-]+\.[A-z]{2,4}$/

匹配身份证号

15位全数字 或 18位最后一位可以是X

var reg1 =/^\d{15}$|^\d{17}[X0-9]$/;
var reg2 = /^(\d{14}|\d{17})[X\d]$/;

匹配用户名

4到16位(字母,数字,下划线,减号)

var reg = /^[A-z0-9_-]{4,16}$/