一、正則表達式概述
二、正則表達式在VBScript中的應用
三、正則表達式在VavaScript中的應用
四、示例
五、總結
一、正則表達式概述
如果原來沒有使用過正則表達式,那么可能對這個術語和概念會不太熟悉。不過,它們并不是您想象的那么新奇。
請回想一下在硬盤上是如何查找文件的。您肯定會使用?和*字符來幫助查找您正尋找的文件。?字符匹配文件名中的單個字符,而*則匹配一個或多個字符。一個如'data?.dat'的模式可以找到下述文件:data1.dat、data2.dat等等。如果使用*字符代替?字符,則將擴大找到的文件數量。'data*.dat'可以匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,盡管這種搜索文件的方法肯定很有用,但也十分有限。?和*通配符的有限能力可以使你對正則表達式能做什么有一個概念,不過正則表達式的功能更強大,也更靈活。
在我們編寫ASP程序時,經常會判斷一個字符串的有效性,如;一個串是否是數字、是否是有效的Email地址等等。如果不使用正則表達式,那么判斷的程序會很長,并且容易出錯,如果使用正則表達式,這些判斷就是一件很輕松的工作了。后面我們將介紹如何判斷數字和Email地址的有效性。
在典型的搜索和替換操作中,必須提供要查找的確切文字。這種技術對于靜態文本中的簡單搜索和替換任務可能足夠了,但是由于它缺乏靈活性,因此在搜索動態文本時就有困難了,甚至是不可能的。
使用正則表達式,能完成些什么事情呢?
測試字符串的某個模式。例如,可以對一個輸入字符串進行測試,看在該字符串是否存在一個電話號碼模式或一個信用卡號碼模式。這稱為數據有效性驗證。
替換文本。可以在文檔中使用一個正則表達式來標識特定文字,然后可以全部將其刪除,或者替換為別的文字。
根據模式匹配從字符串中提取一個子字符串。可以用來在文本或輸入字段中查找特定文字。
例如,如果需要搜索整個web站點來刪除某些過時的材料并替換某些HTML格式化標記,則可以使用正則表達式對每個文件進行測試,看在該文件中是否存在所要查找的材料或HTML格式化標記。用這個方法,就可以將受影響的文件范圍縮小到包含要刪除或更改的材料的那些文件。然后可以使用正則表達式來刪除過時的材料,最后,可以再次使用正則表達式來查找并替換那些需要替換的標記。
那么,正則表達式語法的語法是如何呢?
一個正則表達式就是由普通字符(例如字符a到z)以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
這里有一些可能會遇到的正則表達式示例:
/^/[/t]*$/"^/[/t]*$"匹配一個空白行。
//d{2}-/d{5}/"/d{2}-/d{5}"驗證一個ID號碼是否由一個2位數字,一個連字符以及一個5位數字組成。
/<(.*)>.*<///1>/"<(.*)>.*<///1>"匹配一個HTML標記。
二、正則表達式在VBScript中的應用
VBScript使用RegExp對象、Matches集合以及Match對象提供正則表達式支持功能。我們還是先看一個例子。
<%
FunctionRegExpTest(patrn,strng)
DimregEx,Match,Matches '建立變量。
SetregEx=NewRegExp '建立正則表達式。
regEx.Pattern=patrn '設置模式。
regEx.IgnoreCase=True '設置是否區分字符大小寫。
regEx.Global=True '設置全局可用性。
SetMatches=regEx.Execute(strng) '執行搜索。
ForEachMatchinMatches '遍歷匹配集合。
RetStr=RetStr&"Matchfoundatposition"
RetStr=RetStr&Match.FirstIndex&".Matchvalueis'"
RetStr=RetStr&Match.value&"'."&"
"
Next
RegExpTest=RetStr
EndFunction
response.writeRegExpTest("[ij]s.","IS1Js2IS3is4")
%>
在這個例子中,我們查找字符串中有無is或者js這兩個詞,忽略大小寫。運行的結果如下:
Matchfoundatposition0.Matchvalueis'IS1'.
Matchfoundatposition4.Matchvalueis'Js2'.
Matchfoundatposition8.Matchvalueis'IS3'.
Matchfoundatposition12.Matchvalueis'is4'.
下面我們就介紹這三個對象和集合。
1、RegExp對象是最重要的一個對象,它有幾個屬性,其中:
○Global屬性,設置或返回一個Boolean值,該值指明在整個搜索字符串時模式是全部匹配還是只匹配第一個。如果搜索應用于整個字符串,Global屬性的值為True,否則其值為False。默認的設置為False。
○IgnoreCase屬性,設置或返回一個Boolean值,指明模式搜索是否區分大小寫。如果搜索是區分大小寫的,則IgnoreCase屬性為False;否則為True。缺省值為False。
○Pattern屬性,設置或返回被搜索的正則表達式模式。必選項。總是一個RegExp對象變量。
2、Match對象
匹配搜索的結果是存放在Match對象中,提供了對正則表達式匹配的只讀屬性的訪問。Match對象只能通過RegExp對象的Execute方法來創建,該方法實際上返回了Match對象的集合。所有的Match對象屬性都是只讀的。在執行正則表達式時,可能產生零個或多個Match對象。每個Match對象提供了被正則表達式搜索找到的字符串的訪問、字符串的長度,以及找到匹配的索引位置等。
○FirstIndex屬性,返回在搜索字符串中匹配的位置。FirstIndex屬性使用從零起算的偏移量,該偏移量是相對于搜索字符串的起始位置而言的。換言之,字符串中的第一個字符被標識為字符0
○Length屬性,返回在字符串搜索中找到的匹配的長度。
○value屬性,返回在一個搜索字符串中找到的匹配的值或文本。
3、Matches集合
正則表達式Match對象的集合。Matches集合中包含若干獨立的Match對象,只能使用RegExp對象的Execute方法來創建之。與獨立的Match對象屬性相同,Matches`集合的一個屬性是只讀的。在執行正則表達式時,可能產生零個或多個Match對象。每個Match對象都提供了與正則表達式匹配的字符串的訪問入口、字符串的長度,以及標識匹配位置的索引。
學習了這三個對象和集合,如何應用于字符串的判斷和替換呢?regExp對象的三個方法正好解決了這個問題,它們是Replace方法、Test方法和Execute方法。
1、Replace方法
替換在正則表達式查找中找到的文本。我們還是先看個例子:下面的例子說明了Replace方法的用法。
<%
FunctionReplaceTest(patrn,replStr)
DimregEx,str1'建立變量。
str1="Thequickbrownfoxjumpedoverthelazydog."
SetregEx=NewRegExp'建立正則表達式。
regEx.Pattern=patrn'設置模式。
regEx.IgnoreCase=True'設置是否區分大小寫。
ReplaceTest=regEx.Replace(str1,replStr)'作替換。
EndFunction
Response.writeReplaceTest("fox","cat")&"
"'將'fox'替換為'cat'。
Response.writeReplaceTest("(/S+)(/s+)(/S+)","$3$2$1")'交換詞對.
%>
2、Test方法
對指定的字符串執行一個正則表達式搜索,并返回一個Boolean值指示是否找到匹配的模式。正則表達式搜索的實際模式是通過RegExp對象的Pattern屬性來設置的。RegExp.Global屬性對Test方法沒有影響。
如果找到了匹配的模式,Test方法返回True;否則返回False。下面的代碼說明了Test方法的用法。
<%
FunctionRegExpTest(patrn,strng)
DimregEx,retVal'建立變量。
SetregEx=NewRegExp'建立正則表達式。
regEx.Pattern=patrn'設置模式。
regEx.IgnoreCase=False'設置是否區分大小寫。
retVal=regEx.Test(strng)'執行搜索測試。
IfretValThen
RegExpTest="找到一個或多個匹配。"
Else
RegExpTest="未找到匹配。"
EndIf
EndFunction
Response.writeRegExpTest("is.","IS1is2IS3is4")
%>
3、Execute方法
對指定的字符串執行正則表達式搜索。正則表達式搜索的設計模式是通過RegExp對象的Pattern來設置的。
Execute方法返回一個Matches集合,其中包含了在string中找到的每一個匹配的Match對象。如果未找到匹配,Execute將返回空的Matches集合。
三、javascript中正則表達式的使用
在javascript1.2版以后,javascript也支持正則表達式。
1、replace
replace在一個字符串中通過正則表達式查找替換相應的內容。replace并不改變原來的字符串,只是重新生成了一個新的字符串。如果需要執行全局查找或忽略大小寫,那么在正則表達式的最后添加g和i。
例:
re=/apples/gi;
str="Applesareround,andapplesarejuicy.";
newstr=str.replace(re,"oranges");
document.write(newstr)
結果是:"orangesareround,andorangesarejuicy."
例:
str="TwasthenightbeforeXmas...";
newstr=str.replace(/xmas/i,"Christmas");
document.write(newstr)
結果是:"TwasthenightbeforeChristmas..."
例:
re=/(/w+)/s(/w+)/;str="JohnSmith";
newstr=str.replace(re,"$2,$1");
document.write(newstr)
結果是:"Smith,John".
2、search
search通過正則表達式查找相應的字符串,只是判斷有無匹配的字符串。如果查找成功,search返回匹配串的位置,否則返回-1。
search(regexp)
functiontestinput(re,str){
if(str.search(re)!=-1)
midstring="contains";
else
midstring="doesnotcontain";
document.write(str+midstring+re.source);
}
testinput(/^[1-9]/i,"123")
3、match
match方法執行全局查找,查找結果存放在一個數組里。
例一:
str="Formoreinformation,seeChapter3.4.5.1";
re=/(chapter/d+(/./d)*)/i;
found=str.match(re);
document.write(found);
顯示結果:Chapter3.4.5.1,Chapter3.4.5.1,.1
例二:
str="abcDdcba";
newArray=str.match(/d/gi);
document.write(newArray);
顯示結果D,d.
四、示例
1、判斷數字的正確性
<%@Language=VBScript%>
functionisNumeric(strNumber){
return(strNumber.search(/^(-|/+)?/d+(/./d+)?$/)!=-1);
}
functionisUnsignedNumeric(strNumber){
return(strNumber.search(/^/d+(/./d+)?$/)!=-1);
}
functionisInteger(strInteger){
return(strInteger.search(/^(-|/+)?/d+$/)!=-1);
}
functionisUnsignedInteger(strInteger){
return(strInteger.search(/^/d+$/)!=-1);
}
判斷數字的正確性
<%
DimstrTemp
strTemp=CStr(Request.Form("inputstring"))
IfstrTemp=""ThenstrTemp="0"
%>
原始字符串
<%=strTemp%>
數字
<%=isNumeric(strTemp)%>
非負數字
<%=isUnsignedNumeric(strTemp)%>
整數
<%=isInteger(strTemp)%>
非負整數()
<%=isUnsignedInteger(strTemp)%>
"METHOD="post">
請輸入一個數字:
2、判斷Email地址的正確性
<%
Functionisemail(strng)
isemail=false
DimregEx,Match
SetregEx=NewRegExp
regEx.Pattern="^/w+((-/w+)|(/./w+))*/@[A-Za-z0-9]+((/.|-)[A-Za-z0-9]+)*/.[A-Za-z0-9]+$"
regEx.IgnoreCase=True
SetMatch=regEx.Execute(strng)
ifmatch.countthenisemail=true
EndFunction
%>
五、總結
上面我們介紹了正則表達式的基本概念,以及在VBScript和javascript中如何使用正則表達式,同時,通過一些實例讓大家有了感性的認識。正則表達式的應用范圍很廣,能為大家解決很多實際中的問題。本文介紹的內容只是一些初步的知識,還有很多語法規則需要大家繼續學習,在實踐中發現問題,解決問題。
新聞熱點
疑難解答