正则表达式
创建
- 字面量语法
/表达式内容/后跟修饰符 - 构造函数
new RegExp(‘表达式内容’, ‘修饰符’)
修饰符
- i : 对大小写不敏感;
- g : 查找所有匹配项,即全局查找匹配;全局匹配时,返回的数组元素为在字符串全局查找下的各个匹配结果,不包含捕获内容。
- m : 允许多行匹配,即multiple lines,对获取textarea元素值有帮助;
- y : 开启黏连匹配,与g修饰符不同的是,必须从下一个查找的开始位置就要匹配(也即黏连的含义),而g修饰符只需要下一次查找有匹配即可;
- u : 允许使用Unicode点转义符\u{…}
属性
- source :包含正则表达式的文本,只读;
- global : 用于说明是否带修饰符g,只读布尔值;
- ignoreCase : 用于说明是否带修饰符i,只读布尔值;
- multiline : 用于说明是否带修饰符m,只读布尔值;
- sticky : 用于说明是否带修饰符y,只读布尔值;
- lastIndex : 存储在整个字符串中下一次查找的开始位置,用于g修饰符和y修饰符模式下,可读可写;如果下一次查找没有匹配结果,则lastIndex属性被置0;
构建过程中的术语和操作符
- 精确匹配
除了特殊字符或操作符,字符必须精确出现在表达式中; - 匹配有限字符集
- 匹配一组有限字符集中的任意字符,将字符集包含在[]中,如[abc]表示匹配a、b、c三个字符中的任意一个。
- 如果要匹配一组有限字符集外的任意字符,将字符集包含在[]中,[]开头加^符号,如 [ ^abc ]表示匹配除a、b、c外的任意字符;
- 可以用-来简化表示的字符范围,如[abcdefg]可以表示为[a-g];
- 转义
不是所有字符和字符字面量都是等价的,字母和数字表示其本身,但特殊字符匹配的是其意义,而不是本身。如果需要匹配本身,则要在特殊字符前加\进行转义,使其匹配本身; - 起止符号
^ 作为正则表达式的第一个字符时,表示匹配字符的开始,$作为正则表达式的最后一个字符时,表示匹配字符的结束;同时使用 ^和 $ 匹配整个字符串; - 重复出现
默认都是贪婪模式,即尽可能匹配所有可能的字符;在以下运算符后加?转换为非贪婪模式,即进行最小限度的匹配;如+?表示尽量只匹配字符出现1次;
- 指定字符出现0次或1次,在该字符后加?
- 指定字符必须出现1次及以上,在该字符后加+
- 指定字符出现0次及以上,在该字符后加*
- 指定字符重复出现的次数,在该字符后加{n},n表示出现的次数,如/a{6}/表示字符a连续出现6次
- 指定字符重复出现次数的范围,在该字符后加{m, n},m < n
- 指定字符最少重复出现次数,在该字符后加{n, },表示至少出现n次
- 预定义字符集
正则表达式预定义一些字符集,用一些元字符来表示这些预定义字符集,如\t表示水平制表符,\n表示换行符, .表示除换行符外的任意字符,\d表示任意十进制数字,\D表示除了十进制数字外的任意字符,等等。 - 分组操作
- 如果要对 一组字符使用操作符+或?等等,要将该组字符置于()内。如/(ab)+/表示匹配1个或多个连续的ab;
- 捕获操作,()也可以用于捕获操作,将()所匹配内容存储起来,用于后续操作;
- 如果只是分组,而不想有捕获作用,可以在()开头加?:将圆括号的分组定义为被动子表达式,这样就不会产生捕获作用了。如/(?:ab)+so/中的(?:ab)只是分组,不会捕获内容;
-
或操作符
使用竖线 | 来表示或操作; -
反向引用
反向引用是将正则表达式前面分组捕获到的内容在后面重复出现时的一种简化写法,即前面分组捕获到内容xx,后面如果又出现了xx,则可以用反向引用来简化正则表达式。
\反斜线加数字表示引用内容,其中,数字表示第几个分组捕获的内容,从1开始;引用内容只有匹配时才能确定。
注意: 字符串的replace()方法中的引用要用$加数字;
正则表达式对象的方法
- exec(arg1)
在给定的字符串执行模式匹配搜索。没有任何匹配,返回null;只要找到一个匹配,立刻返回一个数组,数组第一个元素为匹配的字符串,其他元素为捕获内容。数组的index属性表示发生匹配的字符位置,input属性表示正在检索的字符串;
arg1为给定的字符串。
不管正则表达式是否有g修饰符,都只执行匹配一个结果而不是全局搜索匹配。因此,多次调用exec()方法时,每一次搜索从正则表达式的lastIndex属性指定的位置开始。 - test(arg1)
检测给定字符串是否有匹配;有匹配结果,返回true,否则返回false;调用test()跟调用exec()方法等价。
模式匹配的String方法
-
search(arg1)
查找与给定正则表达式匹配的字符串的起始位置并返回该位置;找不到则返回-1;
arg1为给定正则表达式;如果不是正则表达式,则会通过RegExp构造函数转换为正则表达式;
不支持全局搜索;忽略g修饰符; -
replace(arg1, arg2)
执行查找和替换操作,查找与给定字符串或正则表达式匹配的字符串,并替换为给定字符串;
arg1为要查找的字符串或正则表达式,arg2为替换字符串或者$n的反向引用,或者是一个回调函数fn,fn会对匹配结果做进一步处理,返回值将作为替换用的字符串;
回调函数fn(arg1, arg2, …) : arg1为匹配结果,从arg2开始为捕获结果,有多少捕获结果都会传入。(其他参数可参考资料)
全局匹配模式下,所有匹配结果都会被替换为arg2指定的字符串,非全局模式下,则只替换第一个匹配结果。 -
match(arg1)
由给定的正则表达式查找匹配,返回由匹配结果组成的数组。如果是全局匹配,数组包含全部的匹配结果,但不包含捕获结果。如果不是全局匹配,数组第一个元素为匹配结果,其他元素是捕获结果。 -
split(arg1)
由给定的字符串或者正则表达式查找匹配结果,将调用split()方法的字符串用匹配结果分割为数组。
本文深入解析正则表达式的创建、语法、修饰符及应用,包括字面量语法、构造函数、修饰符的作用,以及如何进行精确匹配、分组、捕获、或操作等高级技巧。
794

被折叠的 条评论
为什么被折叠?



