/*******************************************************************
*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"
分享到:
相关推荐
《正则表达式经典实例》讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报...
关于验证一些身份证.电话号码.用户名.密码等等的正则表达式 还有实例说明的哦
javascript将字符串中的多个空格替换为一个空格的正则实例.docx
讲述的是JavaScript的正则表达式一些实例可以帮助你理解javaScript的正则表达式
小编之前整理了不少JavaScript常用的正则表达式实例,都是自己用的,现在放出来给大家分享下。
javascript 校验正则表达式,各种正则表达式实例
本书讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误...
在计算机科学中,正则表达式用来描述或者...不过你也许没必要去埋头学习琢磨不透的正则表达式,看本文和实例给您呈现常用、实用的正则表达式。 PHP常用表达式用法: 1.匹配正整数:/^[1-9]\d*$/ 2.匹配非负整数(正整数
常用的JavaScript验证正则表达式,非常实用
JavaScript正则表达式校验非负整数实例.docx
主要介绍了JavaScript常用正则验证函数,结合实例形式总结分析了javascript针对年龄、数字、Email、手机、URL、日期等格式常用正则验证技巧,需要的朋友可以参考下
本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET的实例。 本书主要包括以下内容: 通过一个精练的教程理解正则...
JavaScript应用实例-正则表达式学习.js
JavaScript应用实例-正则匹配手机号.js