第十章 正则表达式的模式匹配
- 正则表达式是一个描述字符模式的对象
- 使用正则表达式可以进行强大的模式匹配以及文本的检索和替换
- RegEx直接量和对象的创建:ES3规范,用正则表达式创建的RegExp对象会共享一个实例,ES5则是两个独立的实例
- 直接量字符:\o Nul字符;\t 制表符;\n 换行符;\v 垂直制表符;\f 换页符;\r 回车符;\xnn 由十六进制数nn指定的拉丁字符;\uxxxx 由十六进制数xxxx指定的unicode字符;\cX 控制字符^X
- 字符类:将直接量字符单独放进方括号内就组成了字符类(character class)。一个字符类可以匹配它所包含的任意字符
- 可以通过^符号来定义否定字符类,它匹配所有不包含在方括号内的字符
- [...] ——方括号内的任意字符
- [^...] ——不在方括号内的任意字符
- . ——除换行符和其他unicode行终止符之外的任意字符
- \w ——任何ASCII字符组成的单词,相当于[a-zA-Z0-9]
- \W ——任何不是ASCII字符组成的单词,相当于[^a-zA-Z0-9]
- \s ——任何unicode空白符
- \S ——任何非unicode空白符的字符,注意区分\w和\S
- \d ——任何ASCII数字,相当于[0-9]
- \D ——除了ASCII数字之外的任何字符,相当于[^0-9]
- [\b] ——退格直接量(特例)
- 注意,方括号内也可以写这些特殊转义字符,退格符特例
- 重复
- {n,m}:匹配前一项n次,但不能超过m次
- {n,}:匹配前一项n次或更多次
- {n}:匹配前一项n次
- ?:匹配前一项0或1次,相当于{0,1}
- +:匹配前一项1或多次,相当于{1,}
- *:匹配前一项0或多次,相当于{0,}
- 非贪婪的重复:以上匹配都是尽可能多的匹配,称之为贪婪匹配。也可以进行非贪婪匹配,只需在正则表达式后边加上一个问号?
- 选择、分组和引用:指定选择项 + 子表达式分组 +引用前一子表达式的特殊字符
- |:选择,匹配的是左边或右边的子表达式
- (...):组合,将几个项组合成一个单元,单元可通过*,+,?,|等符号修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
- (?:...):只组合,不记忆
- \n:和第n个分组第一次匹配到的字符相匹配,组是圆括号中的子表达式,也有可能是嵌套的
- 选择项的尝试匹配次序是从左到右
- 正则表达式中的圆括号的作用:1、把单独的项组合成子表达式;2、在完整的模式中定义子模式;3、允许在同一正则表达式中引用前面的子表达式
- 通过在\后加一位或多位数字,如\1引用的是第一个带括号的子表达式。注意,子表达式可以嵌套子表达式,所以它的位置是参与计数的左括号的位置
- 正则表达式不允许双引号内容中包含单引号,反之亦然
- 指定匹配位置
- ^:匹配字符串的开头,在多行的检索中,匹配一行的开头
- $:匹配字符串的结尾,在多行的检索中,匹配一行的结尾
- \b:匹配一个单词的边界
- \B:匹配非单词边界的位置
- (?=p):零宽正向先行断言
- (?!p):零宽负向先行断言
- 修饰符
- i:执行不区分大小写的匹配
- g:执行全局匹配,即找到所有匹配
- m:多行匹配模式,^和$匹配一行或字符串的开头或结尾
- 用于模式匹配的String方法
- search():返回第一个匹配的子串的起始位置或-1。若参数不是正则,则转换为正则。不支持全局检索,忽略修饰符g
- replace():检索和替换。$加数字可以替换相应的子表达式匹配的文本。第二个参数可以是函数
- match():返回完整匹配和子表达式匹配
- split():拆分成数组
- RegEx对象:exec()和test()