/******************************************************************* *7.1.1 使用RegExp对象 ******************************************************************/ document.write("<br/>7.1.1 使用RegExp对象<br/>"); var sToMatch = "cat"; var reCat = /cat/; document.writeln(reCat.test(sToMatch) + "<br/>"); // output "true" var sToMatch2 = "a bat, a Cat, a fAt baT, a faT cat"; var reAt = /at/; var arrMatches = reAt.exec(sToMatch2); document.writeln(arrMatches.length + "<br/>"); // output 1 var reAt2 = /at/gi; arrMatches = sToMatch2.match(reAt2); document.writeln(arrMatches + "<br/>"); document.writeln(sToMatch2.search(reAt2)+ "<br/>"); //output 3 /******************************************************************* *7.1.2 扩展的字符串方法 ******************************************************************/ document.write("<br/>7.1.2 扩展的字符串方法<br/>"); var sToChange = "The sky is red."; document.writeln(sToChange.replace("red","blue")+ "<br/>"); //output "The sky is blue." var reRed = /red/g; document.writeln(sToChange.replace(reRed,"blue")+ "<br/>"); //output "The sky is blue." var sResultText = sToChange.replace(reRed, function(sMatch){ return "blue"; }); document.writeln(sResultText+ "<br/>"); //output "The sky is blue." var sColor = "red,blue,yello,green"; var reComma = /\,/; var arrColors = sColor.split(reComma); document.writeln(arrColors.length+ "<br/>"); //output 4 /******************************************************************* *7.2 简单模式 *7.2.1 元字符 *() [] {} \ ^ $ ? * + . | ******************************************************************/ document.write("<br>7.2 简单模式"); document.write("<br>7.2.1 元字符<br/>"); var reQMark = /\?/; /******************************************************************* *7.2.2 使用特殊字符 *\t 制表符 *\n 换行符 *\r 回车符 *\a 换页符 *\e escape字符 *\cX 与X相对应的控制字符 *\b 回退字符 *\v 垂直制表符 *\0 空字符 ******************************************************************/ document.write("<br>7.2.2 使用特殊字符<br/>"); var sColor = "blue"; var reB = /\x62/;//等价于 8进制/\142/,unicode/\u0062/ document.writeln(reB.test(sColor) + "<br/>"); // output "true" //删除换行符 var reWithLines = /\n/g; /******************************************************************* *7.2.3 字符类 ******************************************************************/ document.write("<br/>7.2.3 字符类<br/>"); //1.简单类 var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; var reBatCatRat = /[bcf]at/gi; //var reBatCatRat = /[\u0062cf]at/gi; var arrMatches = sToMatch.match(reBatCatRat); document.writeln(arrMatches.length + "<br/>"); //output "6" //2.负向类 var sToMatch = "a bat, a Cat, a fAt baT, a faT cat"; var reBatCatRat = /[^bc]at/gi; var arrMatches = sToMatch.match(reBatCatRat); document.writeln(arrMatches.length + "<br/>"); //output "2" //3.范围类 var sToMatch = "num1, num2, num3, num4, num5, num6, num7, num8, num9"; var reOneToFour = /num[1-4]/gi; var reNotOneToFour = /num[^1-4]/gi; var arrMatches = sToMatch.match(reOneToFour); document.writeln(arrMatches.length + "<br/>"); //output "4" document.writeln(sToMatch.match(reNotOneToFour).length + "<br/>"); //output "5" //4.组合类 //[a-m1-4\n] //5.预定义类 /** * . [^\n\r] 除了换行和回车之外的任意字符 * \d [0-9] 数字 * \D [^0-9] 非数字字符 * \s [ \t\n\x0B\f\r] 空白字符 * \S [^ \t\n\x0B\f\r]非空白字符 * \w [a-zA-Z_0-9] 单词字符(所有的字母、所有的数字和下划线) * \W [^a-zA-Z_0-9] 非单词字符 */ var sToMatch = "567 9838 abc"; var reThreeNums = /\d{3} \d{4}/; document.writeln(reThreeNums.test(sToMatch) + "<br/>"); //output "true" /******************************************************************* *7.2.4 量词 * ? times = 0, 1 * * (星号) times = 0, 1, 2, ... * + times = 1, 2, ... * {n} times = n * {n,m} times = n, n+1, ..., m-1, m * {n,} itmes = n, n+1, ... ******************************************************************/ document.write("<br/>7.2.4 量词<br/>"); //1.简单量词 var reBreadReadOrRed = /b?red?d/; //匹配bread, read, red //2.贪婪的、惰性的和支配性的量词 /** * 贪婪量词:先看整个字符串是否匹配,如果没有,就去掉最后一个,一直到发现一个匹配或是不剩任何字符 * 惰性量词:从一个字符串开始读入,如果没有,就加入第二个字符,如此知道发现匹配或整个字符串都检查过也没有匹配 * 支配量词:只尝试匹配整个字符串 -> 目前大多浏览器不支持 ******************************************************************* * 贪婪 惰性 支配 * ? ?? ?+ * * *? *+ * + +? ++ * {n} {n}? {n}+ * {n,m} {n,m}? {n,m}+ * {n,} {n,}? {n,}+ ******************************************************************* */ var sToMatch = "abbbaabbbaaabbb1234"; var re1 = /.*bbb/g; var re2 = /.*?bbb/g; //var re3 = /.*+bbb/g; document.writeln(sToMatch.match(re1) + "<br/>"); //output "abbbaabbbaaabbb" document.writeln(sToMatch.match(re2) + "<br/>"); //output "abbb,aabbb,aaabbb" //document.writeln(sToMatch.match(re3) + "<br/>"); //output "abbbaabbbaaabbb" /******************************************************************* *7.4 理解RegExp对象 *7.4.1 实例属性 * global - Boolean * ignoreCase - Boolean * lastIndex - 代表下次匹配将会从哪个字符位置开始(只有当使用exec及 * test函数才会填入,否则为0) * multiline - Boolean, 表示m是否已设置 * source - 在正则表达式的源字符串形式 ******************************************************************/ document.write("<br>7.4 理解RegExp对象"); document.write("<br>7.4.1 实例属性<br/>"); var reDogDog = /dogdog/g; var reDogDog = /(dog){2}/g; var re1 = /(dog)?/; var re2 = /(dog)*/; var re3 = /(dog)+/; var re = /([bd]ad?)*/; var re = /(mom (and dad)?)/; //实例:实现js的trim()方法 String.prototype.trim = function(){ var reExtraSpace = /^\s+(.*?)\s+$/; return this.replace(reExtraSpace,"$1"); } document.write(" abc ".trim().length);//output 3 /******************************************************************* *7.3.2 反向引用 *将表达式计算完后,每个分组都被存放在一个特殊的地方以备将来使用,这些存储 *在分组中的特殊值,我们称之为反向引用 * *反向引用是按照从左到右遇到的左括号字符的顺序进行创建和编号的 *(A?(B?(C?))) -> * (A?(B?(C?))) * (B?(C?)) * (C?) ******************************************************************/ document.write("<br/>7.3.2 反向引用<br/>"); //1.使用正则表达式对象的test()、match()、search()方法后,反向引用的值可 //以从RegExp构造函数中获得 var sToMatch = "#123456789"; var reNumbers = /#(\d+)/; reNumbers.test(sToMatch); document.write(RegExp.$1 +"<br/>"); //output 123456789 //2.使用转义序列 /** * 转义序列: /(dog)\1/ <=> /dogdog/ */ //3.反向引用可以用在String对象的replace()方法中,这通过使用特殊序列$1、$2 //等等来实现,最佳例子是替换字符串中两个单词的位置 var sToChange = "1234 5678"; var reMatch = /(\d{4}) (\d{4})/; var sNew = sToChange.replace(reMatch, "$2 $1"); document.write(sNew +"<br/>"); // output "5678 1234" /******************************************************************* *7.3.3 候选 ******************************************************************/ document.write("<br/>7.3.3 候选<br/>"); var reBadWords = /badword|anotherbadword/gi; var sUserInput = 'This is a string using badword1 and badword2'; var sFinalText = sUserInput.replace(reBadWords, '****'); document.write(sFinalText +"<br/>"); // output "This is a string using ****1 and ****2" var sFinalText = sUserInput.replace(reBadWords, function(sMatch){ return sMatch.replace(/./g,"*"); }); document.write(sFinalText +"<br/>"); // output "This is a string using *******1 and *******2" /******************************************************************* *7.3.4 非捕获性数组 *在较长的正则表达式中,存储反向引用会降低匹配速度; *非捕获性分组,仍然可以拥有与匹配字符串序列同样的能力,而无需存储结果的开销 *在分组的左括号后面添加?: ******************************************************************/ document.write("<br/>7.3.4 非捕获性数组<br/>"); var sToMatch = "#123456789"; var reNumbers = /#(?:\d+)/; reNumbers.test(sToMatch); document.write("nothing:" + RegExp.$1 +"<br/>"); // output "" //实例:去掉文本中的html标签 String.prototype.stripHTML = function(){ return this.replace(/<(?:.|\s)*?>/, ""); } var sTest = "<b>This would be bold</b>"; document.write(sTest.stripHTML() +"<br/>"); // output "" /******************************************************************* *7.3.5 前瞻 ******************************************************************/ document.write("<br/>7.3.5 前瞻<br/>"); var sToMatch1 = "bedroom"; var sToMatch2 = "bedding"; var reBed = /(bed(?=room))/; var reNotRoom = /(bed(?!room))/; document.write(reBed.test(sToMatch1) +"<br/>"); // output "true" document.write(RegExp.$1 +"<br/>"); // output "bed" document.write(reBed.test(sToMatch2) +"<br/>"); // output "false" document.write(reNotRoom.test(sToMatch1) +"<br/>"); // output "false" document.write(RegExp.$1 +"<br/>"); // output "bed" document.write(reNotRoom.test(sToMatch2) +"<br/>"); // output "true" /******************************************************************* *7.3.6 边界 * ^ 行开头 * $ 行结尾 * \b 单词的边界 * \B 非单词的边界 ******************************************************************/ document.write("<br/>7.3.6 边界<br/>"); var sToMatch = "Important word is the last one."; var reLastWord = /(\w+)\.$/; reLastWord.test(sToMatch); document.write(RegExp.$1 +"<br/>"); // output "one" var reFirstWord = /^(.+?)\b/; reFirstWord.test(sToMatch); document.write(RegExp.$1 +"<br/>"); // output "Important" //字符串中抽取单词 var sToMatch = "First second third fourth fifth sixth"; var reWords = /\b(\S+?)\b/g;//复杂写法 var reWords = /(\w+)/g; //简单写法 var arrWords = sToMatch.match(reWords); document.write(arrWords +"<br/>"); // output "First,second,third,fourth,fifth,sixth" /******************************************************************* *7.3.7 多行模式 ******************************************************************/ document.write("<br/>7.3.7 多行模式<br/>"); var sToMatch = "First second\nthird fourth\nfifth sixth"; var reLastWordOnline = /(\w+)$/g; var arrWords = sToMatch.match(reLastWordOnline); document.write(arrWords +"<br/>"); // output "sixth" var reLastWordOnline = /(\w+)$/gm; //多行模式 var arrWords = sToMatch.match(reLastWordOnline); document.write(arrWords +"<br/>"); // output "second,fourth,sixth" /******************************************************************* *7.4 理解RegExp对象 *7.4.1 实例属性 * global - Boolean * ignoreCase - Boolean * lastIndex - 代表下次匹配将会从哪个字符位置开始(只有当使用exec及 * test函数才会填入,否则为0) * multiline - Boolean, 表示m是否已设置 * source - 在正则表达式的源字符串形式 ******************************************************************/ document.write("<br>7.4 理解RegExp对象"); document.write("<br>7.4.1 实例属性<br/>"); var reTest = /[ba]*/i; document.write(reTest.global+"<br/>"); // output "false" document.write(reTest.ignoreCase+"<br/>"); // output "true" document.write(reTest.multiline+"<br/>"); // output "false" document.write(reTest.source+"<br/>"); // output "[ba]* var sToMatch = "bbq is short for barbecue"; var reB = /b/g; reB.exec(sToMatch); document.write(reB.lastIndex + "<br/>"); // output "1" reB.exec(sToMatch); document.write(reB.lastIndex + "<br/>"); // output "2" reB.exec(sToMatch); document.write(reB.lastIndex + "<br/>"); // output "18" reB.exec(sToMatch); document.write(reB.lastIndex + "<br/>"); // output "21" /******************************************************************* *7.4.2 静态属性 * input $_ 最后用于匹配的字符串(传递给exec()或test()的字符串) * lastMatch $& 最后匹配的字符 * lastParen $+ 最后匹配的分组 * leftContext $` 在上次匹配的前面的子串 * multiline $* 用于指定是否所有的表达式都使用多行模式的布尔值 * rightContext $' 在上次匹配之后的子串 ******************************************************************/ document.write("<br/>7.4.2 静态属性<br/>"); //刚使用exec和test完成的匹配的一些特定信息 var sToMatch = "this has been a short, short summer"; var reShort = /(s)hort/g; reShort.test(sToMatch); document.write(RegExp.input + "<br/>"); // output "this has been a short, short summer" document.write(RegExp.leftContext + "<br/>"); // output "this has been a " document.write(RegExp.rightContext + "<br/>"); // output ", short summer" document.write(RegExp.lastMatch + "<br/>"); // output "short" document.write(RegExp.lastParen + "<br/>"); // output "s" //每次执行exec和test时,出multiline外,所有的属性都会被重新设置,但ie和opera //并不支持RegExp.multiline,所以最好对每个表达式设置m值 /******************************************************************* *7.5 常用模式 ** 常见应用场景 ** * 日期 * 信用卡号 * URL * E-mail地址 ******************************************************************/ document.write("<br>7.5 常用模式<br>"); //日期格式: dd/mm/yyyy 如:31/05/2011 var reDate = /\d{1,2}\/\d{1,2}\/d{4}/; //基本匹配,但没有考虑月份及天数的有效范围 //改进版 var reDay = /0[1-9]|[12][0-9]|3[01]/; var reMonth = /0[1-9]|1[0-2]/; var reYear = /19|20\d{2}/; function isValidateDate(sText){ var reDate = /(0?[1-9]|[12][0-9]|3[01])\/(0?[1-9]|1[0-2])\/(19|20\d{2})/; return reDate.test(sText); } document.write(isValidateDate("28/02/2011") + "<br/>"); // output "s" //验证电子邮件地址 var reEmail = /^(?:\w+.?)*\w+@(?:\w+\.?)*\w+$/; function isValidaEmail(sText){ var reEmail = /^(?:\w+.?)*\w+@(?:\w+\.?)*\w+$/; return reEmail.test(sText); } document.write(isValidaEmail("xiawen@pconline.com.cn") + "<br />");//output "true"
javascript中常用正则实例
最新推荐文章于 2024-09-08 13:16:20 发布