JavaScript 正则表达式
什么是正则表达式
- 正则表达式,英语:Regular Expression,在代码中常简写为regex、regexp或RE
- 正则表达式是由一个字符序列形成的搜索模式。
- 当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。
- 正则表达式可以是一个简单的字符,或一个更复杂的模式。
- 正则表达式可用于所有文本搜索和文本替换的操作。
正则表达式的组成
- 正则定界符
- 原子
- 元字符
- 模式修正符
正则定界符
-
在JS中正则表达式的定界符就是一对/,所有写在/之内的都是正则的内容。
-
注意:在其他语言中可以使用其他特殊符号作为正则定界符。
原子
原子是组成正则表达式最基本的单位。任何一个正则表达式至少包含一个原子。
- 所有可见和不可见的字符都是原子!
- 6个特殊原子:
- \d 表示0-9之间的任意一个数字字符
- \D 表示除了0-9之外的任意一个字符
- \s 表示所有不可见字符中的任意一个字符
- \S 表示所有可见字符中的任意一个字符
- \w 表示数字,字母和下划线中的任意一个字符
- \W 表示数字,字母下划线之外的任意一个字符
元字符
元字符的作用就是用来修饰原子,使得正则表达式的结构更加灵活可靠。元字符也叫作原子修饰符。
[]
原子列表
-
用户可以通过原子列表的方式自定义指定范围的字符。原子列表依然表示指定范围字符中的一个字符。
-
注意: 原子列表表示多个字符中的一个字符。
[^]
排除列表
-
排除列表是原子列表的提升,可以限定选取制定字符之外的字符中的一个。
-
注意: 如果列表(原子/排除列表)中的字符在ASCII码上是连续的,可以进行缩写操作
- [ABCDEFG] -> [A-G]
- [2345678] -> [2-8]
- [abcdefghijklmnopqrstuvwxyz] -> [a-z]
\*
任意数量的指定原子
\+
一个数量以上的原子
?
表示0个或1个原子
{}
圈定范围
-
{m} 表示m个原子
-
{m,} 表示m个以上的原子
-
{m,n} 表示m-n个数量之间原子
^
表示字符串必须以正则中指定的字符开头!
$
表示字符串必须以正则中指定的字符结尾!
^正则表达式$ 精确匹配模式
\b
单词边界
表示能够用来分割单词的字符, 空格,标点符号,特殊字符(除了数字和字母)
\B
非单词边界
表示不能够用于分割单词的字符。 数字和字母
注意:词边界和非词边界一般只用于英文正则中。
. 表示除了\n
之外的任意一个字符
注意:如果正则中需要使用字符。 必须进行转义 \。
除此之外,任意在正则表达式中又意义的字符要当做普通字符使用都必须进行转义操作(。 * + ? [] () ^ $)
()
括号元字符
- 可以将多个原子当做一个原子使用,可以添加元字符修饰。
- 将()中的内容暂时存于内存当中,方便后期调用。
- 改变正则的优先级,尝尝和|一起使用
|
或运算元字符
- 表示在|两侧的正则进行二选一操作
模式修正符
- 对匹配模式进行调节的符号。
- 模式修正符在定界符的最后使用。
- var 变量 = /正则内容/模式修正符;
i
忽略英文大小写
g
全局匹配模式
m
多行匹配模式
.*?
贪婪模式与惰性模式
-
正则在进行匹配时,从开始位置查找最远的结束位置,这种模式称之为贪婪模式。
-
在进行HTML标签类似内容获取时,贪婪模式会导致整个内容的返回,需要使用非贪婪模式。
-
固定的书写规则 : .*? 这种方式就是非贪婪模式,或者说是惰性模式
?:
取消暂存内容的作用
- 取消暂存内容的作用,只留运算优先级的作用
- 在
()
最前面 加上?:
字符串 例如(?:/\d/)
正则表达式对象
声明正则表达式的格式:
var 变量 = /正则规则/模式修正符;
var a = /\d/g;
使用对象声明正则表达式:
var 变量 = new RegExp('正则规则','模式修正符');
var a = new RegExp('\\d', 'g');
\\
转义
成员属性
source
- 表示当前正则表达式的正则规则
var a = /\d/g;
var b = a.source;
console.log(b);
输出:\d
获取结果不包括在正则表达式文本中使用的分隔斜线,并且它不包括在“g”,“i” 和“m” 属性。
lastIndex
- 匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置
- 注意: 仅在g模式下会发生变化,没有g模式,该属性永远为0
成员方法
exec() 进行一次正则匹配
- 在g模式下,每一次匹配都会在上一次匹配的位置之后开始继续匹配
- 在非g模式下,每次一次匹配都会从字符串的开头重新匹配。
- 格式: 正则对象。
exec(字符串)
; exec()
和match()
的区别:- 如果在非g模式下,
exec()
和match()
除了操作格式不一样,结果是一样的。 - 在g模式下,
exec()
依然进行一次匹配,只不过在上次匹配的内容之后开始一次新的匹配 - 在g模式下,
match()
是一次性返回字符串中所有符合正则内容组成的数组。
- 如果在非g模式下,
test() 进行正则测试
它的参数是一个字符串,用test( )对某个字符串进行检测,该方法仅仅是用于测试正则内容是否在字符串中出现,匹配成功返回true,匹配失败返回false。
compile() 重新编译正则,垃圾回收再用
- 格式: 正则对象.compile('正则规则','模式修正符')
- 该方法主要用于避免再次创建正则对象,将之前的正则对象修改规则之后继续使用,可以提高程序效率