正则表达式
是一个描述字符模式的对象。
JavaScript中的正则表达式用RegExp对象表示。
正则表达式的定义
正则表达式的创建:
- 可以使用RegExp()构造函数来创建RegExp对象.
- 也可以通过一种特殊的直接量语法来创建。
var pattern = /s$/ == var pattern = new RegExp("s$");
//运行这段代码创建一个新的RegExp对象,并将它赋值给变量pattern,这个特殊的RegExp对象用来匹配所有以字母“s”结尾的字符串。
正则表达式的模式规则是由一个字符序列组成的。包括所有字母和数字在内,大多数的字符都是按照直接量仅描述待匹配的字符的。
1. 直接量字符
正则表达式中的所有字母和字符都是按照字面含义进行匹配的。
通行规则:
- 如果想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀\。
- 对于想按照直接量进行匹配的字母和数字尽量不要用反斜线对其转义。
- 要想在正则表达式中按照直接量匹配反斜线本身,则必须使用反斜线对其转义。"/\\/".
2. 字符类
将直接量字符单独放进方括号内就组成了字符类。
3. 重复
正则表达式的重复字符语法(尽可能多的匹配)
!!!对于"?"、"*",由于字符内可能匹配0个字符,因此他们允许什么都不匹配。
4. 非贪婪的重复
非贪婪重复是匹配尽可能少的,语法为在待匹配字符后加“?”,如 ??、+?。
5. 选择、分组和引用
- 字符"|"用于分隔供选择的字符
选择项的尝试匹配次序是从左到右,直到发现了匹配项。
eg: /ab|cd|ef/可以匹配字符串"ab"、"cd"、"ef"。 - 圆括号有三种作用:
- 把单独的项组合成子表达式。
- 在完整的模式中定义子模式。
- 允许在同一正则表达式的后部引用前面的子表达式。
- 正则表达式不允许用双引号括起的内容中有单引号。
- 在正则表达式中不用创建带数字编码的引用,也可以对子表达式进行分组,以 ("?:" 和 ")"分组。
6.指定匹配位置
正则表达式中的锚字符:
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾
\b 匹配一个单词的边界
\B 匹配非单词的边界
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配P的那些字符
(?|p) 零宽负向先行断言,要求接下来的字符不与P匹配。
7. 修饰符
- 修饰符放在"/"符号之外。
- 修饰符"i"用以说明模式匹配是不区分大小的。
- 修饰符"g"说明模式匹配应该是全局的。
- 修饰符"m"在多行模式中执行匹配,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束。
用于模式匹配的String方法
- search()
参数为一个正则表达式,返回第一个与之匹配的子串的起始位置(不支持全局检索)。 - replace()
其中第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。 - match()
唯一参数就是一个正则表达式,返回的是一个由匹配结果组成的数组。 - exec()
返回一个数组,带有index和input属性。
RegExp对象
RegExp()构造函数带有两个字符串参数,其中第二个参数是可选的,第一个参数包含正则表达式的主题部分。
var zipcode = new RegExp("\d{5}","g");
RegExp属性
- source属性
是一个只读字符串,包含正则表达式的文本。 - global属性
是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符g。 - ignoreCase属性
也是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符i。 - multiline也是一个只读的布尔值,用以说明这个正则表达式是否带有修饰符m。
- lastIndex是一个可读/写的整数,如果匹配模式带有g修饰符,这个属性存储在整个字符串下,一次检索的开始位置。
RegExp方法
- exec()方法
对一个指定的字符串执行一个正则表达式。
即在一个字符串的执行匹配检索,如果没有找到任何匹配就返回null,但如果找到了一个匹配,它将返回一个数组。 - test()方法
它的参数是一个字符串。
用test()对某个字符串进行检索,如果包含正则表达式的一个匹配结果则返回true。
var pattern = /java/i;
pattern.test("javascript"); //返回true