第八章 正则表达式
元字符?与()
?表示紧靠其前的元素项是可选的,。abc?可以匹配abc与ab.
用()表示子匹配。
例如:要匹配两个相同的连续数字字符的正则表达式是(\d)\1.要匹配5个相同的数字字符的正则表达 式为(\d)\1{4};
要匹配1221,2334,这样的数字的正表达式是(\d)(\d)\2\1
a(bc)可以匹配abc与a.
RegExp对象:
JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一个正则表达式对应一个RegExp实例。
有两种可以创建RegExp对象的实例的方法:
显示构造:new RegExp("pattern",[flags]);
隐式构造:/pattern/[flags];
flags部分设置表达式的标志信息,是可选项。g是全局标志。如果不设置这个标志,则仅搜索和替换最早匹配的内容 ,i是忽略大小写标志,m是多行标志。
如:
<!--创建正则表达式-->
<html>
<head></head>
<body>
<script language="javascript">
<!--
var mystring="这是第一个正则表达式的例子";
var myregex=new RegExp("一个");
if(myregex.test(mystring))
document.write("找到了指定模式");
else
document.write("没有找到指定模式");
//-->
</script>
</body>
</html>]
由于JavaScript中的\是一个转义字符,因些,使用构造函数创建RegExp对象时,应将原始正则表达式中的\用\\替换。
RegExp对象的属性:
RegExp对象的属性分为静态和实例属性。
test方法:检查一个字符串中是不是存在创建RegExp对象实例 所指定的表达式模式。
exec方法:对一个字符串进行搜索,并返回一个包含搜索结果的数组。
String的相关方法:match,search,replace.
split方法:该方法返回按照某种分割标志将一个字符串拆分成若干个子字符串所产生的子字符串数组。
如:
<!--8.8.html-->
<html>
<head></head>
<body>
<script language="javascript">
<!--
var splitArray=new Array();
var string="太平洋,大西洋,印度洋,北冰洋";
var regexp=/,/;
splitArray=string.split(regexp);
for(var i=0;i<splitArray.length;i++){
document.write(splitArray[i]+"\n"+"<br>");
}
//-->
</script>
</body>
</html>
8.7限定符与选择匹配符:
用{n}限定连续出现的次数
用{n,}限定至少出现的次数
{n,m}用来限定最少与最多出现的次数
用+限定必须出现一次或连续多次
用*号来规定前面的元素或组合项可以出现多次或零次。
用?表示前面的元素或组合可以出现零次或一次。
默认情况下,正则表达式使用最长匹配原则,例如:要将zoom中匹配zo?的部分替换成为 r,替换后的结果为rom.
当字符?紧跟在其他任何限定符(*,+,?,{n},)后,匹配模式 变成最短匹配原则。在fooood中,fo+?匹配fo.
用选择匹配进行匹配选择,
选择匹配符只有一个,就是“|"字符。用于选择匹配两个选项之中的任意一个。
8.8 分组组合与反向引用符
分组组合是将表达式在某部内容组合起来的符号,反向引用符则是用于匹配分组组合捕获到的内容的标识符。
使用/\b([a-z])+)\1\b/g匹配所有连续重复的单词部分。
\b用于匹配单词的边界。
非捕获匹配:?:pattern
正向预测先行匹配:?=patern
反向预测先行匹配?!pattern
8.9特殊字符与字符匹配符
【 】匹配方括号中包含的字符集中的任意一个字符
[^]用来匹配方括号没有包含的任意字符
[a-z]用来匹配指定范围内的字符
\d匹配任意一个数字
\D匹配任意一个非数字字符
\s匹配任意一个空白字符
\S匹配任意一个非空白字符
\w匹配任意英文字母和数字类字符以及下划线
\W 匹配任何非英文字母和数字符
.匹配任意单个字符
8.10 定位符与原义字符
用^匹配目标字符串的开始位置
用$匹配目标字符串的结尾位置
用\b匹配一个字边符
用\B匹配非字边符
8.11 实用举例
匹配中文字符的正则表达式:[u4e00-u9fa5]
匹配双字节字符:[^x00-xff]
匹配HTML标记的正则表达式:
/<(.*)>.*</1)|<(.*)/>/
匹配网址URL:http"//([w-]+.)+[w-]+(/[w-./?%&=]*)?
用正则表达式限定只能用输入中文:
onkeyup="value"=value.replace(/[^u4e00-u9fa5]/g,' ');
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
//正则表达式匹配输入
<html>
<head></head>
<body>
<form id="reginfo" action="URL地址">
<input id="username" type="text"/>
<input type="submit"/>
</form>
<script>
var reginfo=document.getElementById("reginfo");
var username=document.getElementById("username");
reginfo.onsubmit=function(e){
if(!/^[0-9]{6,9}$/.test(username.value)){
alert("只能输入6到9位数字");
if(e)
e.preventDefault();
else
event.returnValue=false;
}
}
</script>
</body>
</html>
/////////////////////////////////////////////////////////////////////////////////////////////
//阻止用户输入不合法的字符
<html>
<head>
</head>
<body>
<input id="username" type="text"/>
<script>
var username=document.getElementById("username");
username.onkeydown=function(e){
var charCode=(e||event).keyCode;
if(charCode<65||charCode>96){
alert("只能输入0到9数字");
if(e)
e.preventDefault();
else
event.returnValue=false;
}
}
元字符?与()
?表示紧靠其前的元素项是可选的,。abc?可以匹配abc与ab.
用()表示子匹配。
例如:要匹配两个相同的连续数字字符的正则表达式是(\d)\1.要匹配5个相同的数字字符的正则表达 式为(\d)\1{4};
要匹配1221,2334,这样的数字的正表达式是(\d)(\d)\2\1
a(bc)可以匹配abc与a.
RegExp对象:
JavaScript提供了一个RegExp对象来完成有关正则表达式的操作和功能,每一个正则表达式对应一个RegExp实例。
有两种可以创建RegExp对象的实例的方法:
显示构造:new RegExp("pattern",[flags]);
隐式构造:/pattern/[flags];
flags部分设置表达式的标志信息,是可选项。g是全局标志。如果不设置这个标志,则仅搜索和替换最早匹配的内容 ,i是忽略大小写标志,m是多行标志。
如:
<!--创建正则表达式-->
<html>
<head></head>
<body>
<script language="javascript">
<!--
var mystring="这是第一个正则表达式的例子";
var myregex=new RegExp("一个");
if(myregex.test(mystring))
document.write("找到了指定模式");
else
document.write("没有找到指定模式");
//-->
</script>
</body>
</html>]
由于JavaScript中的\是一个转义字符,因些,使用构造函数创建RegExp对象时,应将原始正则表达式中的\用\\替换。
RegExp对象的属性:
RegExp对象的属性分为静态和实例属性。
test方法:检查一个字符串中是不是存在创建RegExp对象实例 所指定的表达式模式。
exec方法:对一个字符串进行搜索,并返回一个包含搜索结果的数组。
String的相关方法:match,search,replace.
split方法:该方法返回按照某种分割标志将一个字符串拆分成若干个子字符串所产生的子字符串数组。
如:
<!--8.8.html-->
<html>
<head></head>
<body>
<script language="javascript">
<!--
var splitArray=new Array();
var string="太平洋,大西洋,印度洋,北冰洋";
var regexp=/,/;
splitArray=string.split(regexp);
for(var i=0;i<splitArray.length;i++){
document.write(splitArray[i]+"\n"+"<br>");
}
//-->
</script>
</body>
</html>
8.7限定符与选择匹配符:
用{n}限定连续出现的次数
用{n,}限定至少出现的次数
{n,m}用来限定最少与最多出现的次数
用+限定必须出现一次或连续多次
用*号来规定前面的元素或组合项可以出现多次或零次。
用?表示前面的元素或组合可以出现零次或一次。
默认情况下,正则表达式使用最长匹配原则,例如:要将zoom中匹配zo?的部分替换成为 r,替换后的结果为rom.
当字符?紧跟在其他任何限定符(*,+,?,{n},)后,匹配模式 变成最短匹配原则。在fooood中,fo+?匹配fo.
用选择匹配进行匹配选择,
选择匹配符只有一个,就是“|"字符。用于选择匹配两个选项之中的任意一个。
8.8 分组组合与反向引用符
分组组合是将表达式在某部内容组合起来的符号,反向引用符则是用于匹配分组组合捕获到的内容的标识符。
使用/\b([a-z])+)\1\b/g匹配所有连续重复的单词部分。
\b用于匹配单词的边界。
非捕获匹配:?:pattern
正向预测先行匹配:?=patern
反向预测先行匹配?!pattern
8.9特殊字符与字符匹配符
【 】匹配方括号中包含的字符集中的任意一个字符
[^]用来匹配方括号没有包含的任意字符
[a-z]用来匹配指定范围内的字符
\d匹配任意一个数字
\D匹配任意一个非数字字符
\s匹配任意一个空白字符
\S匹配任意一个非空白字符
\w匹配任意英文字母和数字类字符以及下划线
\W 匹配任何非英文字母和数字符
.匹配任意单个字符
8.10 定位符与原义字符
用^匹配目标字符串的开始位置
用$匹配目标字符串的结尾位置
用\b匹配一个字边符
用\B匹配非字边符
8.11 实用举例
匹配中文字符的正则表达式:[u4e00-u9fa5]
匹配双字节字符:[^x00-xff]
匹配HTML标记的正则表达式:
/<(.*)>.*</1)|<(.*)/>/
匹配网址URL:http"//([w-]+.)+[w-]+(/[w-./?%&=]*)?
用正则表达式限定只能用输入中文:
onkeyup="value"=value.replace(/[^u4e00-u9fa5]/g,' ');
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
//正则表达式匹配输入
<html>
<head></head>
<body>
<form id="reginfo" action="URL地址">
<input id="username" type="text"/>
<input type="submit"/>
</form>
<script>
var reginfo=document.getElementById("reginfo");
var username=document.getElementById("username");
reginfo.onsubmit=function(e){
if(!/^[0-9]{6,9}$/.test(username.value)){
alert("只能输入6到9位数字");
if(e)
e.preventDefault();
else
event.returnValue=false;
}
}
</script>
</body>
</html>
/////////////////////////////////////////////////////////////////////////////////////////////
//阻止用户输入不合法的字符
<html>
<head>
</head>
<body>
<input id="username" type="text"/>
<script>
var username=document.getElementById("username");
username.onkeydown=function(e){
var charCode=(e||event).keyCode;
if(charCode<65||charCode>96){
alert("只能输入0到9数字");
if(e)
e.preventDefault();
else
event.returnValue=false;
}
}
</script>
<script type="javascript">
var retCat=new RegExp("cat");
//g表示搜索全部,而不是找到第一个匹配后就停止
//i表示不区分大小写
var retCat=new RegExp("cat",gi");
//正则表达式字面量
var retCat=/cat/gi;
//test()方法
var sToMatch="cat";
var reCat=/cat/;
alert(reCat.test(sToMatch));
//match()返回一个在字符串中的所有匹配的数组
var sToMatch="a bat,a cat,a fat bat,a fat cat";
var reAt=/at/gi;
var arrMatches=sToMatch.match(reAt);
alert(arrMatches.length);
//search()方法返回在字符串中出现的一个匹配的位置
var sToMatch="a bat,a cat,a fat bat,a fat cat";
var reAt=/at/gi;
var arrMatches=sToMatch.search(reAt);
alert(arrMatches);
////扩展的字符串方法
//replace()方法
var sToChange="the sky is red";
//alert(sToChange.replace("red","blue"));
var reRed=/red/gi;
alert(sToChange.replace(reRed,"blue"));
//split()方法
var scolor="red,blue,yellow,green";
//var arrColors=scolors.split(",");
var reComma=/\,/;
var arrColors=scolor.split(reComma);
for(var i=0;i<arrColors.length;i++)
alert(arrColors[i]);
//元字符,任何时候使用元字符都必须使用转义
//( [ { ^ $ | ) ? * + ,
var reQMark=/\?/;
//假设想删除字符串中所有的换行符,可以这样做:
var sNewString=sStringWithNewLines.replace(/\n/g,"");
//简单类
var sToMatch="a bat,a cat,a fat bat,a fat cat";
var reBatCatFat=/[bcf]at/gi; //分别匹配b,c,f
var arrMatches=sToMatch.match(reBatCatFat);
//负向类
var reBatCatRat=/[^bc]at/gi;//匹配除了b,c之外的所有字符
//范围类
var reOneToFour=/num[1-4]/gi;//匹配num1,num2,num3,num4
//组合类 [a-m1-4\n]
//预定义类
. [^\n\r] \d [0-9] \D[^0-9] \s空白字符,\S非空白字符,\w所有的字母数字和下划线.\W与\w相反
//假设想匹配三个数字
var reg=/\d\d\d/;
///量词
//?出现0次或1次,*出现0次或多次,+出现一次或多次,{n}一定出现n次,{n,}至少出现n次,{n,m}至少出现n次,但不超过m次.
var reg=/b?rea?d/;
var reg=/b{0,1}rea{0,1}d/;
//贪婪的,惰性的和支配性的量词
//贪婪量词先看整个的字符串是不是一个匹配,如果不匹配,去掉最后字符串中的最后一个字符,再次尝试。
//惰性量词:先看字符串中的第一个字母是不是匹配。
//支配量词:只尝试匹配整个字符串。
//单独一个?贪婪的,但一个问号后面再跟一个?就是惰性的。要使问号成为支配量词,在后面加上一个+
//浏览器对支配量词的支持还不完善,IE不支持。
var re1=/.*bbb/g;//贪婪
var re2=/.*?bbb/g;//惰性
//////////////////////////////////////////////////
//复杂模式
//分组即()
//匹配头部和尾部空白的正则表达式十分简单
var reExtraSpace=/^\s*(.*?)\s+$/;
//候选
var reRedOrBlack=/(red|black|green)/;
//反向引用:按照从左到右遇到的左括号字符的顺序进行创建和编号的。
var sToMatch="#123456789";
var reNumbers=/#(\d+)/;
reNumbers.test(sToMatch);
alert(RegExp.$1);
//
var s="dogdog";
var re=/(dog)\1/;
alert(re.test(s));
//////////////////////
//非捕获性分组
//创建反向引用的分组,我们称之为捕获性分组,非捕获性分组不创建反向引用。节约了存储开销
//如果要创建一个非捕获性分组,只要在左括号的后面加上一个问号和一个紧跟的冒号。
var s="#123456789";
var re=/#(?:\d+)/;
re.test(s);
//
//去掉文本中所有的HTML标签,防止游客在里面插入恶意的HTML
var reTag=/<(?:.|\s)*?>/g; //这个表达式匹配了所有的HTML标签
</script>
<script type="text/javascript">
String.prototype.stripHTML=function(){
var reTag=/<(?:.|\s)*?>/g;//匹配所有的HTML标签
return this.replace(reTag,"");
}
var sTest="<b>this would be good</b>";
alert(sTest.stripHTML);
////////////
//前瞻
</scrpt>
<script type="text/javascript">
//前瞻
//有时候,可能希望,当某个特定的字符分组出现在另一个字符串之前时才去捕获它。
var s1="bedroom";
var s2="bedding";
var re=/(bed(?=room))/;
alert(re.test(s1));
alert(re.test(s2));
////边界,^,$,\b单词的边界,\B非单词的边界
//查找一个单词,只要它只出现在行尾
var sToMatch="Important word is the last one.";
var reLastWord=/(\w+)\.$/;
var reFirstWord=/^(\w+)/;
//使用单词实现
var sToMatch="Important word is the last one.";
var reFirstWord=/^(.+?)\b/;
//多行模式
//要指定多行模式,只要在正则表达式后面添加一个m选项。
var sToMatch="First second\nthird fourth\nfifth sixth";
var reLastWordOnLine=/(\w+)$/gm;//这样就会返回second,fourth,sixth
//////////////////////////////////////
//RegExp对象的实例属性
//lastIndex,代表下次匹配将会从哪个字符位置开始
var sToMatch="bbq is short for barbecue";
var reB=/b/g;
reB.exec(sToMatch);
alert(reB.lastIndex);//1
reB.exec(sToMatch);
alert(reB.lastIndex);//2
reB.exec(sToMatch);
alert(reB.lastIndex);//18
reB.lastIndex=0;
alert(reB.lastIndex);
///////////////////////////
//静态属性
//input,lastMatch,lastParen,leftContext,rightContext
///////////常用模式
//验证日期
function isValidDate(sText){
var reDate=/(?:0[1-9]|[12][0-9]|3[01])\/(?:[1-9]|1[0-2])\/(?:19|20\d{2})/;
return reDate.test(sText);
}
alert(isValidDate("5/5/2004"));
alert(isValidDate("5/5/2032"));
alert(isValidDate("5/5/2044"));
////////////////////////////////////////////////////////
//验证信用卡号
//信用卡号还有点麻烦,涉及到luhn算法
//验证电子邮箱地址
var reEmail=/^(?:\w+\.?)*\w+@(?:\w+\.?)*\w+$;
alert("john.doe@somewhere.com");
</script>