正则表达式
.正则表达式及其作用
.RegExp对象
.String对象中与正则表达式有关的方法
.正则表达式的语法参考
.实用程序举例
什么是正则表达式?
.文件路径通配符
"?"通配符匹配文件名中的单个字符,而"'"通配符匹配零个或多个字符。data?.dat就是一中文
本模式,它能匹配data1.dat,data2.dat,datax.dat,dataN.dat等文件名。data*.dat是另一种文
本模式,它匹配data.dat,data1.dat,data2.dat,data12.dat,datax.dat等文件名。
.正则表达式
是由英文词语regular expression翻译过来的,英文比中文更能实现其含义,就是符合某种规则
的表达式。可以将正则表达式理解为一种对文件进行模糊匹配的语言,它用一些特殊的符号(称
为元字符)来代表某种特征(例如,全都是数字)的一组字符以及指定匹配的次数,含有元字符
的文本不再表示某一具体的文本内容,而是形成了一种文本模式,它可以匹配符合这种模式的所
有文本串。
元字符与子匹配
.元字符
如果一个图书的编号格式是:要么是5个数字字符,例如,10101;要么是5个数字后加上一个连字号
(-),再加上4个数字组成的10个字符,例如,11111-1234。那么,要在一个大的文本串中查找这
两种格式的图书编号时,就可以用\d{5}(-\d{4})?做为匹配模式。
如果要让abc?中的bc同时受到?的作用,必须使用圆括号将他们括起来,使它们成为一个紧密结合
的组合项,这样后面的?就表示圆括号中的内容可有可无,例如,a(bc)?能匹配a和abc。
.字匹配
圆口号所括起来的部分为一个子匹配(也叫子表达式),除了可以得到整个正则表达式的匹配
结果外,还可以单独得到每个子表达式部分所匹配的结果。
多个子表达式所匹配的原始内容按照它们正则表达式模式中从左到右出现的顺序存储在缓冲区中
,这种过程称为捕获。圆括号中的子匹配所捕获的内容可在整个表达式中位于这个括号之后的
地方被反引用,第一括号(即第一个子匹配)捕获的内容用\1表示,第二个圆括号(即第二个子
匹配)捕获的内容\2表示,依次类推。例如,要匹配2个相同的连续字符的正则表达式为(\d)\1.
要匹配连续5个相同的数字字符的正则表达式为(\d)\1{4}.要匹配1221.3553.6776等数字。可以
使用正则表达式为(\d)(\d)\2\1。
正则表达式的作用
.测试字符串是否匹配某个模式,从而实现数据格式的有效性验证。
.将一段文本中满足某一正则表达式模式的文本内容替换为别的内容或删除(即替换为空字符串)
例如,将一大段文本中的所有的19xx年的内容替换为20xx年,其中xx部分是两个任意的数字,
不会被替换,但不能简单地用20替换19,否则1919就被替换为2020。
.在一段文本中搜索具有某一类型特征的文本内容。精确搜索和正则表达式的模式搜索最大的区
别就是:精确搜索是搜索一个具体的文本,而模式搜索是模式搜索具有某一类型特征的文本。
RegExp对象
JavaScript中提供了一个名为RegExp的对象来完成有关正则表达式的操作和功能,每一条正则
表达式模式对应一个RegExp对象实例。
创建RegExp对象实例
(1)使用RegExp对象的显示构造函数,语法为:new RegExp("pattern"[,"flags"]);
(2)使用RegExp对象的隐式构造函数,采用纯粹的文本格式:/pattern/[flags]
flags标志字符:
-g 用做全局标志
-i 用做忽略大小写标志
-m 用做多行标志
如果没有设置这个标志,那么元字符"^"只与整个被搜索字符串的开始位置相匹配,而元字符
"$"只与整个被搜索字符串的结束位置相匹配。如果设置了这个标志,那么"^"还可以与被
搜索字符串中的"\n"或"\r"之后的位置相匹配。
注意:
当使用构造函数的方式创建RegExp实例对象的时候,应将原始的正则表达式模式文本中的每个
"\"都使用"\\"来替换,例如,下面的语句等价:
var re=new RegExp("\\d{5}");
var re=^d{5}/
RegExp对象-属性
.所有RegExp对象实例共享静态属性
.单个对象实例的属性
静态属性:
.index
.input
.lastIndex
.lastMatch
.lastParen
.lastContext
.leftContext
.rightContext
.$1...$9
对象实例属性:
.global
.ignoreCase
.multiline
.source
RegExp对象-方法
.test方法
语法格式为:test(str)。检查一个字符串中是否存在创建RegExp对象实例所指定的正则表达式模式
.exec方法
语法格式为:exec(str)。使用创建RegExp对象实例时所指定的正则表达式模式对一个字符串执行
搜索,并返回一个包含搜索结果的数组。
.compile方法
语法格式为:compile("pattern"[,"flags"])。更换RegExp对象实例所使用的正则表达式模式,并
将新的正则表达式模式编译为内部格式,从而使以后的匹配过程执行更快。
RegExp对象-综合举例
code:
<script language="javascript">
var strSrc="xxa1b01c001yya2b02c002zz";
var re="/a(\d)b(\d{2})c(\d{3})/gi";
var arr,count=0;
while((arr = re.exec(strSrc))!=null)
{
displayResult();
}
function displayResult()
{
document.write(<p>这是用正则表达式/"+re.source+"/gi对字符串<br>\""
+RegExp.input+ "\"进行第" +(++count)+ "次搜索的结果:<br>");
document.write("RegExp.index为"+RegExp.index+"<br>");
document.write("RegExp.lastindex为"+RegExp.lastindex+"<br>");
document.write("RegExp.lastMatch为"+RegExp.lastMatch+"<br>");
document.write("RegExp.lastParen为"+RegExp.lastParen+"<br>");
document.write("RegExp.lastContext为"+RegExp.lastContext+"<br>");
document.write("RegExp.$1为"+RegExp.$1+"<br>");
document.write("RegExp.$1为"+RegExp.$2+"<br>");
document.write("RegExp.$1为"+RegExp.$3+"<br>");
document.write("RegExp.$1为"+RegExp.$4+"<br>");
document.write("arr.index为"+arr.index+"<br>");
document.write("arr.input为"+arr.input+"<br>");
document.write("arr.lastindex为"+arr.lastindex+"<br>");
document.write("返回的元素个数为"+arr.length+"<br>");
document.write("返回数组的类容为[");
for(var i=0;i<arr.length;i++)
{
if(arr.length-1)
document.write("\""+arr[i]+"\",");
else
document.write("\""+arr[i]+"\"]</p>");
}
}
</script>
String对象中与正则表达式有关的方法
.match方法
语法格式为:match(Exp)。与RegExp对象的exec方法类似,它使用正则表达式模式对字符串执行
搜索,并返回一个包含搜索结果的数组。
<script language="javascript">
var strSrc="xxa1b01c001yya2b02c002zz";
var re=/a(\d)b(\d(2))c(\d{3})/gi;
var arr;
arr=strSrc.match(re);
for(var i=0;i<arr.length;i++)
{
if(i<arr.length-1)
document.write("[\""+arr[i]+"\",");
else
document.write("\""+arr[i]+"\"]");
}
</script>
.search方法
语法格式为:serach(rgExp)。返回使用正则表达式搜索时,第一个匹配的字符串在整个被搜索
的字符串中的位置。
.replace方法
语法格式为: replace(rgExp,replaceText)。使用正则表达式模式对字符串执行搜索,并对搜索
到的内容用指定的字符串替换,返回值包含替换后的内容的字符串对象。