JavaScript--正则表达式
1. 正则表达式
是一个描述字符模式的对象.
1.创建方式
1) 正则表达式直接量
var pattern = /s$/;
2) RegExp()构造函数
var pattern = new RegExp("s$");
2. 直接量字符
正则表达式中所有字母和数字都是按照字面含义进行匹配的。
字符 匹配
-----------------------
字母和数字 自身
\t 制表符
\n 换行符
\v 垂直制表符
\f 换页符
\r 回车符
\xnn 由十六进制数nn指定的拉丁字符 \x0A => \n
\uxxxx 由十六进制xxxx指定的Unicode字符,例如 \u0009 => \t
\cX 控制字符 ^X,例如 \cJ 等价于换页符 \n
3. 字符类
将直接量字符单独放在方括号内就组成了字符类。一个字符类可以匹配它所有包含的任意字符。
[...] 方括号内的任意字符
[^...] 不在方括号内的任意字符
特殊字符类
. 除换行符和其他Unicode行终止符之外的任意字符
\w 任何ASCII字符,等价于[a-zA-Z0-9]
\W 任何非ASCII字符组成的,等价于[^a-zA-Z0-9]
\s 任何Unicode空白符:空格,制表符,回车
\S 任何非Unicode空白符的字符
\d 任何ASCII数字,等价于 [0-9]
\D 任何非ASCII数字之外的任意字符,等价于 [^0-9]
[\b] 退格直接量(特例)
4. 重复 一定要用在子表达式之后
{n,m} 匹配前一项至少n次,但是不超过m次
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n次
? 匹配前一项0次或者1次,等价于{0,1}
+ 匹配前一项1次或者多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}
例如:
/[abc]/ 匹配"a" "b" "c"中任意一个字符
/[^abc]/ 匹配"a" "b" "c"之外的任意一个字符
/\d{2,4}/ 匹配2~4个数字
/\w{3}\d?/ 匹配三个字符或和一个可选的数字
/\s+java\s+/ 匹配前后带有一个或多个空格的字符串"java"
5. 重复方式
贪婪重复
匹配重复字符时是尽可能多地匹配
非贪婪重复
在待匹配的字符后跟随一个问号即可: ?? +? *? {1,5}?
例如:
/a+/ 可以匹配一个或者多个连续的字母a, 当使用"aaa"作为匹配字符串时正则表达式会匹配它的三个字符
/a+?/ 可以匹配一个或者多个连续的字母a, 但是尽可能少地匹配。只能匹配第一个a
6. 选择
使用字符 "|" 分割供选择的字符。选择项的尝试匹配次序是从左到右,直到发现了匹配项,如果左边的选择项匹配,就忽略右边的匹配项,即使它产生更好的匹配。/ab|cd|ef/ 可以匹配 "ab"或者"cd"或者"ef"
7. 分组
"()"作用:
1) 把单独的项组合成子表达式
以便可以像处理一个单元那样用"|""*""+""?"对单元内的项进行处理
/java(script)?/ 可以匹配字符串java,后面的script可以有也可以没有
/(ab|cd)+|ef/ 可以匹配"ef",也可以匹配"ab""cd"一次或者多次
2) 在完整的模式中定义子模式
当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分。
/[a-z]+\d+/ 一个或者多个小写字母后跟随一个或者多个数字
(/[a-z]+(\d+)/) 可以抽出每个匹配末尾的数字
3) 在同一正则表达式后面引用前面的子表达式。
\1 引用第一个带圆括号的子表达式
/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/ \2 引用 ([Ss]cript)
对正则表达式中前一个子表达式的引用,并不是指对子表达式模式的引用,而是对与那个模式相匹配的文本的引用
例如:
/['"][^'"]*['"]/ 匹配单引号或者双引号内的0个或者多个字符,但是它并不要求左侧和右侧的引号匹配
/(['"])[^'"]*\1/ 匹配单引号或者双引号内的0个或者多个字符,但是它要求左侧和右侧的引号匹配
8. 指定匹配位置
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,即位于字符\w和\W之间的位置,或者位于字符\w和字符串的开头或结尾之间的位置。
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配
9. 修饰符
不是出现在两条斜线之间,而是出现在第二条斜线之后。
new RegExp("","igm")
i 说明匹配模式匹配是不区分大小写
g 说明模式匹配应该是全局的
m 用以在多行模式中执行匹配。
/java$/im 可以匹配"java",也可以匹配"java\nis fun"
2. Javascript中 String对正则表达式的支持
1. search()
参数为一个正则表达式。如果参数不为正则表达式,则先通过RegExp将其转换为构造函数。不支持全局检索,返回第一个与之匹配的子串的位置,如果找不到匹配的子串,返回-1。
"JavaScript".search(/script/i); //返回4
2. replace()
用以执行检索和替换操作。第一个参数是正则表达式,第二个参数是要替换的字符串。
text.replace(/javascript/gi,"JavaScript"); //不区分大小写将所有javascript转换为JavaScript
3. match()
最常用的正则表达式方法,参数为正则表达式。返回由匹配结果组成的数组。
当正则表达式中没有g修饰符的时候,就不是全局匹配。这时,数组的第一个元素就为匹配的字符串,剩余的元素则是由正则表达式中用圆括号括起来的子表达式。如果该正则表达式设置为修饰符g,则该方法返回的数组包含字符串中所有匹配结果。
"1 plus 2 equals 3".match(/\d+/g) //返回["1","2","3"]
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "visit my blog at http://www.briup.com/~ee";
var result = text.match(url);
if(result!=null){
var fullurl = result[0];
var protocol = result[1];
var host = result[2];
var path = result[3];
}
4. split() 方法用于把一个字符串分割成字符串数组。
语法:stringObject.split(separator(必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。),howmany(可选))
返回值为一个字符串数组 参数可以为正则表达式
"1, 2, 3, 4, 5".split(/\s*,\s*/); //["1","2","3","4","5"] 允许分隔符左右两边留有空白
"2:3:4:5".split(":") //将返回["2", "3", "4", "5"]
"|a|b|c".split("|") //将返回["", "a", "b", "c"]
"hello".split("") //可返回 ["h", "e", "l", "l", "o"]
"hello".split("", 3) //返回一部分字符,请使用 howmany 参数 返回 ["h", "e", "l"]
3. Javascript中RegExp
1. 构造函数
第一个参数包括正则表达式的主体部分,即正则表达式直接量中两条斜线之间的文本
第二个参数指定正则表达式的修饰符。只能传入g ,i,m或者其组合,可以省略
var zipcode = new RegExp("/\d{5}","g");
2. 属性
source 包含正则表达式文本
global 布尔值,表明这个正则表达式是否带有修饰符g
ignoreCase 布尔值,表明这个正则表达式是否带有修饰符i
multiline 布尔值,表明这个正则表达式是否带有修饰符m
lastIndex 如果匹配模式带有g,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec(), test()方法调用到
3.方法
1) exec()
与match类似。参数为字符串。对一个指定的字符串执行一个正则表达式在一个字符串中执行匹配检索,如果没有找到任何匹配,返回null,如果找到了匹配,返回一个数组。这个数组元素中的第一个元素包含与正则表达式相匹配的子字符串,剩余的元素是圆括号内的子表达式相匹配的子串。当调用的正则表达式对象具有修饰符g时,它将把当前正则表达式对象的lastIndex属性设置为紧挨着匹配子串的字符位置,当同一个正则表达式第二次调用exec()时,它将从lastIndex属性所指的字符处开始检索。如果没有匹配到任何结果将lastIndex重置为0.
var pattern = /Java/ig;
var text = "JavaScript is more fun than java_is good";
var result;
while((result = pattern.exec(text))!=null){
console.log(result[0]+" at "+result.index);
}
2) test()
参数为字符串。用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,返回true.调用test()和调用exec()行为等价,test()会从lastIndex指定位置处开始检索某个字符串,如果它找到了一个匹配结果,立即设置lastIndex为当前匹配字符串的结束位置。
var pattern = /Java/ig;
var text = "JavaScript is more fun than java_is good";
var pattern.test(text); //结果 true
与test() exec()不同,String方法search() replace() match()并不会用到lastIndex属性