正则表达式学习(三)
RegExp对象的静态属性
.input 最后用于匹配的字符串(传递给test,exec方法的字符串)
var re = /A-Z/;
var str = "Hello,World!";
var arr = re.exec(str);
alert(RegExp.input); //Hello,World!
re.exec(tempstr);
alert(RegExp.input); //还是Hello,World!,因为tempstr并不匹配
.lastMatch 最后匹配的字符
var re = /[a-z]/g;
var str = "hi";
re.test(str);
alert(RegExp.lastMatch); //h
re.exec(str);
alert(RegExp["$&"]); //i 这是lastMatch另一种形式
.lastParen 最后匹配的分组
var re = /[a-z](\d+)/gi;
var str = "Class1 Class2 Class3";
re.test(str);
alert(RegExp.lastParen); //1
re.test(str);
alert(RegExp["$+"]); //2 这是lastParen另一种形式
.leftContext 返回被查找的字符串从字符串开始位置到最后匹配之前的位置之间的字符
.rigthContext 返回被查找的字符串中从最后一个匹配位置开始到字符串结尾之间的字符
var re = /[A-Z]/g;
var str = "123ABC456";
re.test(str);
alert(RegExp.leftContext); //123
alert(RegExp.rightContext); //BC456
re.exec(str);
alert(RegExp["$`"]); //123A 这是leftContext另一种形式
alert(RegExp["$'"]); //C456 这是rightContext另一种形式
.multiline 返回正则表达式是否使用多行模式,针对所有正则表达式,IE和Opera需要单独写
var re = /\w+/;
alert(re.multiline); //false
re = /\w+/m;
alert(RegExp["$*"]); //true 这是multiline另一种形式
元字符 使用时需转义前面加"\"
([{\^$|)?*+.
var str = "?";
var re = /\?/;
alert(re.test(str)); //true
str = "\?"
re = new RegExp("\?"); //出错,相当于re = /?/
re = new RegExp("\\?"); //正确
alert(re.test(str)); //true
引入ASCII码和Unicode编码表示特殊字符
var re = /^\x43\x4A$/;//ASCII码十六进制,将匹配CJ
alert(re.test("CJ"));//true
re = /^\103\112$/; //ASCII码八进制,将匹配CJ
alert(re.test("CJ"));
re = /^\u0043\u004A$/; //Unicode编码十六进制,必须使用u开头,接着是字符编码的四位16进制表现形式
alert(re.test("CJ")); //true
一些预定义特殊字符
\n 换行符
\r 回车符
\t 制表符
\f 换页符(Tab)
\cX 与X对应的控制字符
\b 退格符(BackSpace)
\v 垂直制表符
\0 空字符("")
字符类 包括简单类,反向类,范围类,组合类,预定义类
//简单类
var re = /[abc123]/; //将匹配abc123这6个字符中一个
//负向类
re = /[^abc]/; //将匹配除abc之外的一个字符
范围类
re = /[a-b]/; //将匹配小写a-b中一个
re = /[^0-9]/; //将匹配除0-9之外的一个字符
//组合类
re = /[a-b0-9A-Z_]/; //将匹配字母,数字和下划线
预定义类
. [^\n\r] 匹配除换行符之外的任何一个字符,IE下[^\n]
\d [0-9] 匹配数字
\D [^0-9] 匹配非数字
\s [\n\r\t\f\x0B] 匹配一个空字符
\S [^\n\r\t\f\x0B] 匹配一个非空字符
\w [a-zA-Z0-9_] 匹配字母数字和下划线
\W [^a-zA-Z0-9_] 匹配非字母数字和下划线
量词
* 等价于{0,} 匹配前面的子表达式零次或者多次.例如zo*能匹配"z"以及"zoo"
+ 等价于{1,} 匹配前面的子表达式一次或者多次.例如zo+能匹配"zo"以及"zoo",但不能匹配"z"
? 等价于{0,1} 匹配前面的子表达式零次或者一次.例如do(es)?能匹配"do"或者does
{n} n是一个非负整数,匹配确定的n次.例如o{2}不能匹配"Bob",可以匹配"food"中两个o
{n,} n是一个非负整数,匹配至少n次.例如o{2,}不能匹配"Bob",可以匹配"foooood"中所有o
{n,m} m和n均为非负整数,其中n<=m,最少匹配n次,最多匹配m次.例如o{1,3}将匹配"food"中前三个o
o+ 等价于o{1,}
o* 等价于o{0,}
o? 等价于o{0,1} 注意逗号和两个数之间不能有空格
贪婪量词与惰性量词
贪婪量词,目前遇到的所有量词都是贪婪量词,先整个匹配,再从后往前逐一递减匹配,匹配完成就退出.
惰性量词,在贪婪量词后面加个"?"而已,先第一个字符匹配,再从前往后注意增加匹配,匹配完成就退出.
var str = "abc";
var re = /\w+/; //将匹配abc
re = /\w+?/; //将匹配a
多行模式
var re = /[a-z]$/;
var str = "ab\ncdef";
alert(str.replace(re,"#")); //ab\ncde#
re = /[a-z]$/m;
alert(str.replace(re,"#")); //a#\ncde
捕获性分组与非捕获性分组
re = /abc{2}/; //将匹配abcc
re = /(abc){2}/; //将匹配abcabc
str = "abcabc ###";
arr = re.exec(str); //arr = [abcabc,abc]
//上面都是捕获性分组
//下面是非捕获性分组
re = /(?:abc){2}/;
arr = re.exec(str); //arr = [abcabc]
alert(arr[1]); //undefined
候选,就是所说的"或"
re = /^a|bc$/; //将匹配开始位置的a或结束位置的bc
str = "add";
alert(re.test(str)); //true
re = /^(a|bc)$/; //将匹配a或bc,同时为开始位置和结束位置
alert(re.test(str)); //true
反向引用
当包含分组的正则表达式进行过exec,test,match,search这些方法之后,每个分组都被放在一个特俗的地方以备将来使用,这些存储是分组中的特殊值,我们称之为反向引用
var re = /(A?(B?(C?)))/; //将产生三个分组(A?(B?(C?)))和(B?(C?))和(C?)
var str = "ABC";
re.exec(str); //[ABC,ABC,BC,C]
alert(RegExp.$1); //ABC
alert(RegExp.$2); //BC
alert(RegExp.$3); //C
//反向引用也可用\1,\2...这类形式使用
re = /\d+(\D)\d+\1\d+/;
str = "2008-1-1";
alert(re.exec(str)); //2008-1-1,-
re = /\d+(\D)(\d+)\1\2/; //这里第一个括号内(\D)作为\1,第二个括号(\d+)作为\2
str = "2008_4_4";
alert(re.exec(str)); //2008_4_4,-,4
正负\向前瞻
//正向前瞻 用来捕获出现在特定字符之前的字符,只有当字符后面跟着某个特定字符才去捕获它。
var re = /([a-z]+(?=\d))/i;
var str = "abc every1 abc";
alert(re.exec(str)); //[every,every]
alert(RegExp.$1); //every
alert(re.lastIndex); //0 使用前瞻的好处是(?=\d)不会当成一次匹配,下次匹配仍然从它开始
//负向前瞻 用来捕获当字符后面不跟着某个特定字符时才去匹配的字符。
re = /([a-z]+(?!\d))/i;
str = "abc1 one"
alert(re.exec(str)); //ab
alert(RegExp.$1); //ab