网络编程 
首页 > 网络编程 > 浏览文章

超全的js正则表达式整理笔记

(编辑:jimmy 日期: 2024/11/18 浏览:3 次 )

var reCat = new RegExp("cat", "gi"); //RegExp构造函数可以带一个或两个参数,第一个参数描述需要进行匹配的模式字符串,第二个参数指定了额外的处理命令 
var reCat = /cat/gi; //使用Perl风格的语法 
 
 i:执行对大小写不敏感的匹配 
 g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) 
 m:执行多行匹配 


元字符 

元字符是表达式语法的一部分,在正则表达式中用到的所有元字符有:{ [ ( \ ^ $ | ) ] } "\\"); //注意这里是两个反斜杠,双重转义  

\xxx 查找以八进制数 xxx 规定的字符,如:/\142/为字符b 
\xdd 查找以十六进制数 dd 规定的字符,如:/\x62/为字符b 
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符,如:/\u0062/为字符b 
\r 查找回车符 
\n 查找换行符 
\f 查找换页符 
\t 查找制表符 
\v 查找垂直制表符 
\a 查找alert字符 
\e 查找escape字符 
\cX 查找与X相对应的控制字符 
\0 查找 NULL 字符 
 
. 查找单个字符,除了换行和行结束符,等同于[^\n\r] 
\w 查找单词字符,等同于[a-zA-Z_0-9] 
\W 查找非单词字符,等同于[^a-zA-Z_0-9] 
\d 查找数字,等同于[0-9] 
\D 查找非数字字符,等同于[^0-9] 
\s 查找空白字符,等同于[ \t\n\x0B\f\r],\x0B为垂直tab和\t一样 
\S 查找非空白字符,等同于[^ \t\n\x0B\f\r] 

方括号 

[abc] 查找方括号之间的任何字符 
[^abc] 查找任何不在方括号之间的字符 
[0-9] 查找任何从 0 至 9 的数字 
[a-z] 查找任何从小写 a 到小写 z 的字符 
[A-Z] 查找任何从大写 A 到大写 Z 的字符 
[A-z] 查找任何从大写 A 到小写 z 的字符 
[adgk] 查找给定集合内的任何字符 
[^adgk] 查找给定集合外的任何字符 

量词 
"color: #800000">贪婪量词:先看整个的字符串是否匹配,如果发现没有匹配,去年该字符串中的最后一个字符并再次尝试,如:"htmlcode">

var sToMatch = "abbbaabbbaaabbb1234"; 
var re1 = /.*bbb/g; //匹配结果为"abbbaabbbaaabbb" 
var re2 = /.*"abbb","aabbb","aaabbb" 
var re3 = /.*+bbb/g; //匹配不了,直接报错 

复杂模式之分组:通过一系列括号包围一系列字符、字符类以及量词来使用的 
/(dog){2}/  匹配"dogdog" 
/([bd]ad"ba", "da", "bad", "dad" 
/(mom( and dad)"mom", "mom and dad" 
/^\s*(.*"color: #800000">复杂模式之反向引用:也叫捕获性分组,按照从左到右遇到的左括号字符的顺序进行创建和编号的,例如表达式(A"htmlcode">

var sToMatch = "#123456789"; 
var reNumbers = /#(\d+)/; 
reNumbers.test(sToMatch); 
alert(RegExp.$1); //"123456789",$1保存了第一个反向引用,依次可以用$2,$3... 

然后,可以直接在定义分组的表达式中包含反向引用,通过使用特殊转义序列如\1、\2等实现 

var sToMatch = "dogdog"; 
var reDogdog = /(dog)\1/; //等同于/dogdog/ 
alert(reDogdog.test(sToMatch)); //true 

第三,反向引用可以用在String对象的replace()方法中,通过使用特殊字符序列如$1、$2等实现 

var sToChange = "1234 5678"; 
var reMatch = /(\d{4}) (\d{4})/; 
alert(sToChange.replace(reMatch, "$2 $1")); //"5678 1234" 

复杂模式之候选:使用管道符(|)放在两个单独的模式之间 

var reBadWords = /badword | anotherbadword/gi; 
var sUserInput = "This is a String using badword1 and badword2."; 
var sFinalText = sUserInput.replace(reBadWords, function(sMatch){ 
 return sMatch.replace(/./g, "*"); //用星号替换敏感词中的每一个字母 
}); 

复杂模式之非捕获性分组:相比捕获性分组,不会创建反向引用,在较长的正则表达式中,存储反向引用会降低匹配速度,通过使用非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销 

var sToMatch = "#123456789"; 
var reNumbers = /#("",输出空字符串是因为该分组是非捕获性的 
alert(sToMatch.replace(reNumbers, "abcd$1")); //输出结果是"abcd$1"而不是"abcd123456789",不能使用任何反向引用 

又如: 

String.prototype.stripHTML = function(){ 
 var reTag = /<(""); 
} 

复杂模式之前瞻:告诉正则表达式运算器向前看一些字符而不移动其位置,存在正向前瞻(检查接下来出现的是不是某个特定字符集)和负向前瞻(检查接下来的不应该出现的特定字符集) 
正向前瞻("htmlcode">

var sToMatch1 = "bedroom"; 
var sToMatch2 = "bedding"; 
var reBed1 = /(bed("bed"而不是"bedroom" 
alert(reBed1.test(sToMatch2)); //false 
alert(reBed2.test(sToMatch1)); //false 
alert(reBed2.test(sToMatch2)); //true 
alert(RegExt.$1); //输出的也是"bed" 

复杂模式之边界:用于正则表达式中表示模式的位置 
n$ 匹配任何结尾为 n 的字符串,如:/(\w+)\.$/匹配行尾单词"one.","two."等 
^n 匹配任何开头为 n 的字符串,如:/^(.+"color: #800000">复杂模式之多行模式: 

var sToMatch = "First second\nthird fourth\nfifth sixth"; 
var reLastWordOnLine = /(\w+)$/gm; 
alert(sToMatch.match(reLastWordOnLine)); //输出["second", "fourth", "sixth"]而不只是"sixth" 

RegExp对象的属性和方法: 
global  //RegExp 对象是否具有标志 g 
ignoreCase  //RegExp 对象是否具有标志 i 
multiline  //RegExp 对象是否具有标志 m 
source  //正则表达式的源文本 
lastIndex  //一个整数,标示下一次匹配钭会从哪个字符位置开始(只有当使用exec()和test()函数才会填入,否则为0) 
真正使用到的是lastIndex,如:  

 
var sToMatch = "bbq is short for barbecue"; 
var reB = /b/g; 
reB.exec(sToMatch); 
alert(reB.lastIndex); //1,匹配位置是0,lastIndex为1 
reB.exec(sToMatch); 
alert(reB.lastIndex); //2 
reB.exec(sToMatch); 
alert(reB.lastIndex); //18 
reB.lastIndex = 0; //重头开始匹配 
reB.exec(sToMatch); 
alert(reB.lastIndex); //1而不是21 

静态属性 
input,短名为$_,最后用于匹配的字符串(传递给exec()或test()的字符串) 
leftContext,短名为$^,在上次匹配的前面的子串 
rightContext,短名为$^,在上次匹配之后的子串 
lastMatch,短名为$&,最后匹配的字符 
lastParen,短名为$+,最后匹配的分组 
multiline,短名为$*,用于指定是否所有的表达式都使用多行模式的布尔值,不同于其它属性,不依赖最后一次执行的匹配,它可以设置所有的正则表达式的m选项,RegExp.multiline = "true";,注意IE和Opera不运行它  

 var sToMatch = "this has been a short, short summer"; 
 var reShort = /(s)hort/g; 
 reShort.test(sToMatch); 
 alert(RegExg.input); //"this has been a short, short summer"; 
 alert(RegExg.leftContext); //"this has been a "; 
 alert(RegExg.rightContext); //", short summer"; 
 alert(RegExg.lastMatch); //"short" 
 alert(RegExg.lastParen); //"s" 
 
compile() //编译正则表达式 
alert(reCat.exec("a cat, a Cat, a cAt caT")); //返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用 
alert(reCat.test("cat")); //true,检索字符串中指定的值,返回 true 或 false。 

支持正则表达式的String对象的方法 

var sToMatch = "a bat, a Cat, a fAt, a faT cat"; 
var reAt = /at/gi; 
alert(sToMatch.match(reAt)); //返回一个包含在字符串中的所有匹配的数组 
alert(sToMatch.search(reAt)); //输出第一次在字符串中出现的位置3,全局匹配g在search()时不起作用 
alert(sToMatch.replace(reAt, "Dog")); //替换与正则表达式匹配的子串 
alert(sToMatch.replace(reAt, function(sMatch){ 
 return "Dog"; 
})); 
alert(sToMatch.split(/\,/)); //把字符串分割为字符串数组 

常用模式 
日期:/("aa").length;} 
全角字符:/[^uFF00-uFFFF]/g 
匹配特定数字: 

^[1-9]\d*$    //匹配正整数 
^-[1-9]\d*$   //匹配负整数 
^-?[1-9]\d*$   //匹配整数 
^[1-9]\d*|0$  //匹配非负整数(正整数 + 0) 
^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0) 
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数 
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数 
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数 
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0) 
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0) 

是不是很全面,很详细,感觉不错的就把这文章好好收藏,js正则表达式很重要的学习环节,大家一定好好学习。

上一篇:半小时精通正则表达式-精华版
下一篇:JavaScript中的正则表达式使用及验证qq号码的正则