目录
正则表达式(Regular Expression)是一个描述字符模式的对象,字符模式就是由一系列字符构成的特殊格式的字符串,它由普通字符(A~Z、a~z、0~9)和元字符组成。正则表达式的语法主要就是对各种字符的功能进行描述。
1、字符描述
根据正则表达式的语法规则,大部分字符仅能够描述自身,这些字符被称为普通字符,如所有的字母、数字等。
元字符 就是拥有特殊意义的字符,一般需要加反斜杠进行表示,以便对原字符进行转义,避免与字符本身的予以发生冲突。
元字符 | 描述 | 元字符 | 描述 |
. | 查找单个字符,处理换行和行结束符 | ||
\w | 查找单词字符 | \W | 查找单词字符 |
\d | 查找数字 | \D | 查找非数字字符 |
\s | 查找空白字符 | \S | 查找非空白字符 |
\b | 匹配单词边界 | \B | 匹配非单词边界 |
\0 | 查找NUL字符 | \n | 查找换行符号 |
\f | 查找换页符 | \r | 查找回车符 |
\t | 查找制表符 | \v | 查找垂直制表符 |
\xxx | 查找以八进制数xxx规定的字符 | \xdd | 查找以十六进制数dd规定的字符 |
\uxxx | 查找以十六进制数xxx规定的Unicode字符 |
2、字符范围
在正则表达式中方括号用来查找特定范围内的字符,在方括号内仅指定起止字符,然后中间部分通过连字符(-)表示。如果在方括号内添加脱字符(^)前缀,就表示定义处除了范围内之外的字符。例如:
[abc] | 查找方括号之间的任何字符 |
[^abc] | 查找任何不在方括号之间的字符 |
[0-9] | 查找任何从0-9的数字,即查找任何数字 |
[a-z] | 查找任何从小写a到小写z的字符,即查找任何小写字母 |
[A-Z] | 查找任何从大写A到大写Z的字符,即查找任何大写字母 |
[A-z] | 查找任何从大写A到小写z的字符,即查找任何形式的字母 |
[adgk] | 查找给定结合内的任何字符 |
[^adgk] | 查找给定集合外的任何字符 |
3、选择操作
选择类似于 JavaScrip t语法中的逻辑与,使用竖线(|)描述,表示在两个子模式的匹配结果中任选一个。例如:
//设计正则表达式匹配任意数字或字母
var s1 = "abc";
var s2 = "123";
var r = /\w+|\d+/; //选择重复字符类
var b1 = r.test(s1); //返回true
var b2 = r.test(s2); //返回true
4、重复类量词
JavaScript 正则表达式约定了重复类量词,它们分别定义了重复匹配字符的确数或约数。
量词 | 描述 |
n+ | 匹配任何包含至少一个 n 的字符串 |
n* | 匹配任何包含零个或多个 n 的字符串 |
n? | 匹配任何包含零个或一个 n 的字符串 |
n{x} | 匹配包含 x 个 n 的序列的字符串 |
n{x,y} | 匹配包含 x 个或 y 个 n 的序列的字符串 |
n{x,} | 匹配包含至少 x 个 n 的序列字符串 |
var r = /go?gle/g; //匹配前一项字符o0次或1次
var r = /go{1,2}gle/g; //匹配前一项字符o1次或2次
5、边界量词
边界就是确定匹配模式的位置,如字符串的头部或尾部。
量词 | 说明 |
^ | 匹配开头,在多行检测中,会匹配一行的开头 |
$ | 匹配结尾,在多行检测中,会匹配一行的结尾 |
6、声明量词
声明量词包括正向声明和反响声明两种模式。正向声明:声明表示条件的意思,是指定匹配模式后面的字符必须被匹配,但不返回匹配结果。正向声明使用"(?=匹配条件)"表示。
var s = "a:213,b=456";
var r = /\w*(?==)/; //使用正向声明,指定执行匹配必须满足的条件
var r1 = /\w*(?!=)/; //使用反向声明,执行执行匹配不必满足的条件
var x = s.match(r); //返回数组["b"]
var x1 = s.match(r1); //返回数组["a"]
上面例子中,通过使用(?==)锚定条件,指定只有 \w*所能偶匹配的字符后面跟随一个等号字符,才能够执行 \w* 匹配,所以,最后匹配的结果是字符 b ,而不是字符 a 。vice versa。
7、表达式分组
使用小括号()操作符可以对正则表达式字符串进行任意分组,在小括号内的字符串表示子表达式,或者称为子模式,子表达式具有独立的匹配功能,匹配结果页具有独立性。同时跟随在小括号后的量词将会作用于整个子表达式。
把单个项目进行分组,以便合成子表达式。这样就可以像处理一个独立的字符那样,使用I、+、*或?等元字符来处理它们。
var s = "javascript is not java";
var r = /java(script)?/g;
var a = s.match(r); //返回数组("javascript","java")
上面的正则表达式可以匹配字符串 ”javascript”,也可以匹配字符串"java”,因为在匹配模式中通过分组,使用量词 “?” 来修饰该子表达式,这样匹配字符串时,其后既可以有 “script”,也可以没有。
8、子表达式引用
在正则表达式执行匹配运算时,表达式计算会自动把每个分组(子表达式)匹配的文本临时存储起来以备将来使用。这些存储在分组中的特殊值,被称为反向引用。反向引用将遵循从左到右的顺序,根据表达式中的左括号字符的顺序进行创建和编号。
本例定义匹配模式包含多个子表达式。
var s = "abcdefghijklmn";
var r = /(a(b(c)))/;
var a = s.match(r); //返回数组["abc","bc","c"]