/*******************************************************************
*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中常用的正则表达式及其应用场景。 ### 1. 匹配中文字符 ``` [\u4e00-\u9fa5] ``` 这个正则表达式用于匹配任何中文字符。Unicode编码中的`[\u4e00-\u9fa5]`区间涵盖了绝大...
下面我们将详细探讨JavaScript中常用的正则表达式及其应用。 1. **基础概念** - **模式**:正则表达式的核心,描述要匹配的字符序列。 - **修饰符**(或标志):改变正则表达式的匹配行为,例如`g`(全局搜索)、...
以下是一些常见的JavaScript正则表达式及其用途: 1. **校验全由数字组成的字符串**: ```javascript function isDigit(s) { var patrn = /^[0-9]{1,20}$/; return !patrn.exec(s); } ``` 这个函数用于判断...
JavaScript中的正则表达式是编程语言中用于处理字符串的强大工具,尤其在数据验证方面发挥着重要作用。它们可以用来检查、提取、替换或者匹配文本模式,适用于身份证号、电话号码、用户名和密码等常见输入的验证。 ...
### JavaScript常用正则表达式知识点解析 #### 一、引言 在JavaScript开发过程中,正则表达式是一种非常强大的文本处理工具,它可以帮助开发者高效地完成字符串搜索与替换任务。本文将详细介绍一些JavaScript中常见...
### JavaScript中的正则表达式使用详解 #### 一、引言 正则表达式是一种功能强大的文本模式匹配工具,广泛应用于各种编程语言中,包括JavaScript。在JavaScript中,正则表达式不仅是一种模式匹配的方式,还是一个...
正则表达式则是JavaScript中的一个重要工具,用于处理字符串的模式匹配和查找。在这个“JavaScript手册及正则表达式详解”中,我们将深入探讨这两个关键主题。 一、JavaScript基础 JavaScript是一种解释型、弱类型...
### JavaScript将字符串中的多个空格替换为一个空格的正则实例 在Web开发与日常编程中,我们经常需要处理字符串。特别是在用户输入或者文本处理过程中,常常会遇到需要清理字符串中的多余空格的情况。例如,当从...
JavaScript对象和正则表达式是编程语言JavaScript中的核心概念,特别是在处理字符串操作和模式匹配时。正则表达式(Regular Expression)是一种强大的文本处理工具,它允许我们通过一种简洁的语法来描述复杂的字符串...
在这个"JavaScript常用函数数、常用正则表达式收集___下载.zip"压缩包中,我们可以预见到一系列与JavaScript相关的实用工具函数和常用的正则表达式模式。 首先,让我们来探讨JavaScript中的常用函数。在JavaScript...
### JavaScript中的正则表达式详解 #### 正则表达式的重要性与应用场景 正则表达式在JavaScript编程中扮演着至关重要的角色,特别是在处理文本数据时。它提供了一种灵活且强大的方式来查找、替换和操纵字符串。...
这是一种在JavaScript中常用的方法,它可以让自定义函数变成所有字符串实例的成员,从而简化代码的编写。 总结来说,正则表达式在JavaScript中是一个非常重要的工具,尤其在处理字符串时,可以提供强大而灵活的文本...
JavaScript正则表达式是编程语言JavaScript中的一个重要组成部分,它用于处理文本字符串,进行模式匹配、查找、替换等操作。在JavaScript中,正则表达式是一种强大的工具,可以帮助开发者实现复杂的数据验证、文本...
JavaScript中的正则规则遵循ECMAScript规范,通过`/pattern/flags`的形式定义,其中`pattern`是模式,`flags`是可选的修饰符,如`g`(全局搜索)、`i`(不区分大小写)和`m`(多行模式)。 这个"js脚本集合"很可能...
下面我们将详细探讨JavaScript正则表达式的核心概念、语法特性以及常见用法。 1. **基础概念** - **模式匹配**:正则表达式定义了一个模式,用来匹配字符串中的特定字符序列。 - **元字符**:如`\d`代表数字,`\w...
### JavaScript中的正则表达式详解 #### 一、正则表达式概述 正则表达式是一种强大的文本处理工具,能够帮助开发者实现字符串的查找、替换等功能。在JavaScript中,正则表达式通过`RegExp`对象来实现。此对象提供了...