概念:
正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法。
创建正则表达式
两种方法:字面量方式,构造函数方式
//字面量方式,其由包含在斜杠之间的模式组成
var re = /ab+c/
//构造函数方式,调用RegExp对象的构造函数
var re = new RegExp("ab+c")
字符分类
正则表达式子面试是斜杠/
之间的部分,由字符组成,不过里面的字符有的是字面上的意思,有的却有特殊作用。
/regular expression /igm
img 为修饰符,用于附加一些规则。ES6中还增加了uys修饰符。
我们把表示字面意思的字符称为字面量字符
,有特殊作用的字符称为元字符。
主要的元字符有:.
^
$
|
\
?
*
+
(
)
[
]
{
}
点字符(.
)
点字符(.
)表示任意字符,糊了回车(\r
),换行(\n
),行分隔符(\u2028
),段分隔符(\u2029
),以及码点大于0xFFFF
的字符。
注:ES6推出的u
修饰符,能匹配上码点大于0xFFFF
的字符
var reg=/\d/
var str="11123bcd"
var res=str.replace(reg,"a") //将数字换为a
console.log(res)//a1123bcd 只要匹配到符合规则的就返回
位置字符(^
$
)
位置字符^
表示字符串的开始位置,而$
表示字符串的结束位置
// 字符串中有以 abc 开头的部分
/^abc/.test('abcdef') // true
// 字符串中有以 def 结尾的部分
/def$/.test('abcdef') // true
// 字符串从开头到结尾只有 abc
/^abc$/.test('abc'); // true
选择符(|
)
选择符( |
)在正则表达式中表示"或",比如 /cat|dog/
表示匹配 cat
或 dog
// 字符串中有 cat 或 dog
/cat|dog/.test('cat') // true
/cat|dog/.test('dog') // true
转义字符(\
)
如果要在正则表达式中表示元字符
,就得进行转义,即跟在\
后面。
注意,如果正则表达式是以构造函数生成的,由于第一个参数是字符串,所以本身会转义,得用两个转义符号\\
才行
var r = new RegExp('a\\.c');// /a\.c/
集合类([]
)、脱字符(^
)、连字符(-
)
集合类([]
)用于表示一系列字符可用来匹配,相当于一个字符集合,将字符都放到[
和]
之间。
//字符串中有a,b,c其中一个字符
/[abc]/.test('a');//true
/[abc]/.test('b');//true
/[abc]/.test('c');//true
集合类中,^
不是位置字符,而是脱节字符,表示集合类之中的字符都不能用来匹配
集合类中,-
也算特殊字符,称为连字符,表示连续的字符集合
//字符串中有a到z小写字母其中一个字符
/[a-z]/.test('b') //true
//字符串中有数字、小写字母、大写字母其中一个字符
/[0-9a-zA-Z]/.test(1) //true
注意: 连字符 -
支队单个字符生效,所以[1-31]
代表从1
到3
的字符,而不是从1
到31
。另外也可以对unicode字符生效
//字符串理由1、2、3其中之一
/[1-31]/.test(4) //flase
//字符串中有从\u0128 到\uFFFF 其中一个
/[\u018-\uFFFF]/.test('\0130\u0131\u01332')//true
重复类({}
)、量词符(?
*
+
)、贪婪模式
重复类({}
)用于表示也给字符的重复次数(即出现次数)
{n}
:字符重复n
次。{n,}
:字符重复至少n
次{n,m}
:字符重复n
到m
次
//字符o重复两次
/lo{2}/.test('look') //true
/lo{2}/.test('lok') //flase
正则表达式中还可以用量词符来表示字符的出现的次数
?
:字符出现0
次或1
次,相当于{0,1}
*
:字符出现至少0次,相当于{0,}
+
:字符出现至少1
次,相当于{1,}
//字符t出现0次 或 1次
/t?est/.test('test')//true
/t?est/.test('est')//true
通常情况下,指定了字符的出现次数后,都是按最多的情况去匹配,这一规则称为贪婪模式
.
//贪婪模式下:字符a出现1到4次,则按最多的情况返回
/a{1,4}/.exec('aaaabc')[0]//"aaaa"
为了匹配更少的,可以采用非贪婪模式
,通过在后面跟上?
就可以
//非贪婪模式:字符a出现1到4次,则按最少的情况返回
/a{1,4}?/.exec('aaaabc')[0]//"a"
不可打印字符
正则表达式对一些不可带引的特殊字符,提供了表达方式:
\cx
:表示Ctrl- [X]
,其中X
是A-Z
之中任一个英文字母,用来匹配空值字符[\b]
:匹配退格键(U+0008
),不要与\b
混淆\r
:匹配回车键\n
:匹配换行键\t
:匹配制表符tab(U+0009
)\v
:匹配垂直制表符(U+0008
)\f
:匹配换页符(U+000C
')\0
:匹配null字符(U+0000
)\xhh
:匹配一个以两位十六进制书(\x00-\xFF
)表示的字符\xhhh
:匹配一个以四位十六进制数(\u0000-uFFFF
)表示的Unicode
字符
预定义字符
预定义字符是对正则表达式中一些常用字符匹配的简写
\d
:匹配0
到9
的任意数字,相当于[0-9]
\D
:匹配0
到9
以为的字符,相当于[^0-9]
\w
:匹配任意的字母,数字和下划线,相当于[a-zA-Z0-9_]
\W
:匹配字母,数字和下划线以外的字符,相当于[^a-zA-Z9-9_]
\s
:匹配空格(包括换行符,制表符,空格符等),相当于[\r\n\t\v\f]
\S
:匹配非空格的字符,相当于[^\r\n\t\v\f]
\b
:匹配词边界,表示词独立\B
:匹配非词边界,表示词不独立
// 单词 world 独立
/\bworld/.test('hello world') // true
/\bworld/.test('world hello') // true
/\bworld/.test('hello-world') // true
/\bworld/.test('world-hello') // true
/world\b/.test('world hello') // true
/world\b/.test('hello world') // true
/world\b/.test('hello-world') // true
/world\b/.test('world-hello') // true
// 单词 world 不独立
/\Bworld/.test('hello world') // false
/\Bworld/.test('helloworld') // true
/world\B/.test('hello world') // false
/world\B/.test('helloworld') // true
修饰符(i
g
m
u
y
s
)
修饰符放在正则表达式斜杠/
后面,用于附加一些规则
i
:忽略大小写(ignore
)g
:全局匹配(global
),只要剩余位置上有匹配就行,使用字符串的match
方法时返回每次匹配的内容形成的数组,而不会返回分组的内容m
:允许多行(multiline
),只影响位置符号^
和$
u
:Unicode
模式,用来正确匹配码点大于\uFFFF
的字符y
:粘结(sticky
),确保多值匹配时,从剩余的第一个位置能匹配上s
:单行(singleline
),又称dotAll
模式,点字符(.
)代表了所有字符,包括换行符\n
等
// i 忽略大小写
/abc/.test('ABC') // false
/abc/i.test('ABC') // true
// g 全局匹配
'abbcbb'.match(/bb/) // ["bb", index: 1, input: "abbcbb", groups: undefined]
'abbcbb'.match(/bb/g) // ["bb","bb"]
// m 允许多行
/world$/.test('hello world\n') // false
/world$/m.test('hello world\n') // true
// u Unicode 模式
'
标签:字符,匹配,正则表达式,字符串,test,true
From: https://www.cnblogs.com/rhy2103/p/17815004.html