一、正則表達(dá)式概述
如果原來沒有使用過正則表達(dá)式,那么可能對(duì)這個(gè)術(shù)語和概念會(huì)不太熟悉。不過,它們并不是您想象的那么新奇。
請(qǐng)回想一下在硬盤上是如何查找文件的。您肯定會(huì)使用 ? 和 * 字符來幫助查找您正尋找的文件。? 字符匹配文件名中的單個(gè)字符,而 * 則匹配一個(gè)或多個(gè)字符。一個(gè)如 'data?.dat' 的模式可以找到下述文件:data1.dat、data2.dat等等。如果使用 * 字符代替 ? 字符,則將擴(kuò)大找到的文件數(shù)量。'data*.dat' 可以匹配下述所有文件名:data.dat、data1.dat、data12.dat等等,盡管這種搜索文件的方法肯定很有用,但也十分有限。? 和 * 通配符的有限能力可以使你對(duì)正則表達(dá)式能做什么有一個(gè)概念,不過正則表達(dá)式的功能更強(qiáng)大,也更靈活。
在我們編寫ASP程序時(shí),經(jīng)常會(huì)判斷一個(gè)字符串的有效性,如;一個(gè)串是否是數(shù)字、是否是有效的Email地址等等。如果不使用正則表達(dá)式,那么判斷的程序會(huì)很長,并且容易出錯(cuò),如果使用正則表達(dá)式,這些判斷就是一件很輕松的工作了。后面我們將介紹如何判斷數(shù)字和Email地址的有效性。
在典型的搜索和替換操作中,必須提供要查找的確切文字。這種技術(shù)對(duì)于靜態(tài)文本中的簡單搜索和替換任務(wù)可能足夠了,但是由于它缺乏靈活性,因此在搜索動(dòng)態(tài)文本時(shí)就有困難了,甚至是不可能的。
使用正則表達(dá)式,能完成些什么事情呢?
測試字符串的某個(gè)模式。例如,可以對(duì)一個(gè)輸入字符串進(jìn)行測試,看在該字符串是否存在一個(gè)電話號(hào)碼模式或一個(gè)信用卡號(hào)碼模式。這稱為數(shù)據(jù)有效性驗(yàn)證。
替換文本??梢栽谖臋n中使用一個(gè)正則表達(dá)式來標(biāo)識(shí)特定文字,然后可以全部將其刪除,或者替換為別的文字。
根據(jù)模式匹配從字符串中提取一個(gè)子字符串??梢杂脕碓谖谋净蜉斎胱侄沃胁檎姨囟ㄎ淖?。
例如,如果需要搜索整個(gè) web 站點(diǎn)來刪除某些過時(shí)的材料并替換某些HTML 格式化標(biāo)記,則可以使用正則表達(dá)式對(duì)每個(gè)文件進(jìn)行測試,看在該文件中是否存在所要查找的材料或 HTML 格式化標(biāo)記。用這個(gè)方法,就可以將受影響的文件范圍縮小到包含要?jiǎng)h除或更改的材料的那些文件。然后可以使用正則表達(dá)式來刪除過時(shí)的材料,最后,可以再次使用正則表達(dá)式來查找并替換那些需要替換的標(biāo)記。那么,正則表達(dá)式語法的語法是如何呢?
一個(gè)正則表達(dá)式就是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文
字主體時(shí)待匹配的一個(gè)或多個(gè)字符串。正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。
這里有一些可能會(huì)遇到的正則表達(dá)式示例:
/d{2}-d{5}/ “d{2}-d{5}” 驗(yàn)證一個(gè)ID 號(hào)碼是否由一個(gè)2位數(shù)字,一個(gè)連字符以及一個(gè)5位數(shù)字組成。
/<(.*)>.*</1>/ “<(.*)>.*</1>” 匹配一個(gè) HTML 標(biāo)記。
二、正則表達(dá)式在VBScript中的應(yīng)用
VBScript使用RegExp對(duì)象、Matches集合以及Match對(duì)象提供正則表達(dá)式支持功能。我們還是先看一個(gè)例子。
Function RegExpTest(patrn, strng)
Dim regEx, Match, Matches ?。Ы⒆兞?。
Set regEx = New RegExp ?。Ы⒄齽t表達(dá)式。
regEx.Pattern = patrn ?。гO(shè)置模式。
regEx.IgnoreCase = True ?。гO(shè)置是否區(qū)分字符大小寫。
regEx.Global = True ?。гO(shè)置全局可用性。
Set Matches = regEx.Execute(strng) ?。?zhí)行搜索。
For Each Match in Matches ?。П闅v匹配集合。
RetStr = RetStr & “Match found at position ”
RetStr = RetStr & Match.FirstIndex & “. Match Value is '”
RetStr = RetStr & Match.Value & “'.” & “<BR>”
Next
RegExpTest = RetStr
End Function
response.write RegExpTest(“[ij]s.”, “IS1 Js2 IS3 is4”)
%>
在這個(gè)例子中,我們查找字符串中有無is或者js這兩個(gè)詞,忽略大小寫。運(yùn)行的結(jié)果如下:
Match found at position 4. Match Value is 'Js2'.
Match found at position 8. Match Value is 'IS3'.
Match found at position 12. Match Value is 'is4'.
下面我們就介紹這三個(gè)對(duì)象和集合。
1、RegExp對(duì)象 是最重要的一個(gè)對(duì)象,它有幾個(gè)屬性,其中:
○Global 屬性,設(shè)置或返回一個(gè) Boolean 值,該值指明在整個(gè)搜索字符串時(shí)模式是全部匹配還是只匹配第一個(gè)。如果搜索應(yīng)用于整個(gè)字符串,Global 屬性的值為 True,否則其值為 False。默認(rèn)的設(shè)置為 False。
○IgnoreCase 屬性,設(shè)置或返回一個(gè)Boolean值,指明模式搜索是否區(qū)分大小寫。如果搜索是區(qū)分大小寫的,則IgnoreCase 屬性為 False;否則為 True。缺省值為 False。
○Pattern 屬性,設(shè)置或返回被搜索的正則表達(dá)式模式。必選項(xiàng)??偸且粋€(gè) RegExp 對(duì)象變量。
2、Match 對(duì)象
匹配搜索的結(jié)果是存放在Match對(duì)象中,提供了對(duì)正則表達(dá)式匹配的只讀屬性的訪問。 Match 對(duì)象只能通過 RegExp 對(duì)象的 Execute 方法來創(chuàng)建,該方法實(shí)際上返回了 Match 對(duì)象的集合。所有的 Match 對(duì)象屬性都是只讀的。在執(zhí)行正則表達(dá)式時(shí),可能產(chǎn)生零個(gè)或多個(gè) Match 對(duì)象。每個(gè) Match 對(duì)象提供了被正則表達(dá)式搜索找到的字符串的訪問、字符串的長度,以及找到匹配的索引位置等。
○FirstIndex 屬性,返回在搜索字符串中匹配的位置。FirstIndex 屬性使用從零起算的偏移量,該偏移量是相對(duì)于
搜索字符串的起始位置而言的。換言之,字符串中的第一個(gè)字符被標(biāo)識(shí)為字符 0
○Length 屬性,返回在字符串搜索中找到的匹配的長度。
○Value 屬性,返回在一個(gè)搜索字符串中找到的匹配的值或文本。
3、Matches 集合
正則表達(dá)式 Match 對(duì)象的集合。Matches 集合中包含若干獨(dú)立的 Match 對(duì)象,只能使用 RegExp 對(duì)象的 Execute 方法來創(chuàng)建之。與獨(dú)立的 Match 對(duì)象屬性相同,Matches `集合的一個(gè)屬性是只讀的。在執(zhí)行正則表達(dá)式時(shí),可能產(chǎn)生零個(gè)或多個(gè) Match 對(duì)象。每個(gè) Match 對(duì)象都提供了與正則表達(dá)式匹配的字符串的訪問入口、字符串的長度,以及標(biāo)識(shí)匹配位置的索引。
學(xué)習(xí)了這三個(gè)對(duì)象和集合,如何應(yīng)用于字符串的判斷和替換呢?regExp對(duì)象的三個(gè)方法正好解決了這個(gè)問題,它們是Replace方法、Test方法和Execute方法。
1、Replace 方法
替換在正則表達(dá)式查找中找到的文本。我們還是先看個(gè)例子:下面的例子說明了 Replace 方法的用法。
Function ReplaceTest(patrn, replStr)
Dim regEx, str1 ' 建立變量。
str1 = “The quick brown fox jumped over the lazy dog.”
Set regEx = New RegExp ' 建立正則表達(dá)式。
regEx.Pattern = patrn ' 設(shè)置模式。
regEx.IgnoreCase = True ' 設(shè)置是否區(qū)分大小寫。
ReplaceTest = regEx.Replace(str1, replStr) ' 作替換。
End Function
Response.write ReplaceTest(“fox”, “cat”) & “<BR>” ' 將 'fox' 替換為 'cat'。
Response.write ReplaceTest(“(S+)(s+)(S+)”, “$3$2$1”) ' 交換詞對(duì).
%>
2、Test 方法
對(duì)指定的字符串執(zhí)行一個(gè)正則表達(dá)式搜索,并返回一個(gè) Boolean 值指示是否找到匹配的模式。正則表達(dá)式搜索的實(shí)際模式是通過RegExp對(duì)象的Pattern屬性來設(shè)置的。RegExp.Global屬性對(duì)Test方法沒有影響。
如果找到了匹配的模式,Test方法返回True;否則返回False。下面的代碼說明了Test 方法的用法。
Function RegExpTest(patrn, strng)
Dim regEx, retVal ' 建立變量。
Set regEx = New RegExp ' 建立正則表達(dá)式。
regEx.Pattern = patrn ' 設(shè)置模式。
regEx.IgnoreCase = False ' 設(shè)置是否區(qū)分大小寫。
retVal = regEx.Test(strng) ' 執(zhí)行搜索測試。
If retVal Then
RegExpTest = “找到一個(gè)或多個(gè)匹配。”
Else
RegExpTest = “未找到匹配。”
End If
End Function
Response.write RegExpTest(“is.”, “IS1 is2 IS3 is4”)
%>
3、Execute 方法
對(duì)指定的字符串執(zhí)行正則表達(dá)式搜索。正則表達(dá)式搜索的設(shè)計(jì)模式是通過 RegExp 對(duì)象的 Pattern 來設(shè)置的。
Execute 方法返回一個(gè) Matches 集合,其中包含了在 string 中找到的每一個(gè)匹配的 Match 對(duì)象。如果未找到匹配,Execute 將返回空的 Matches 集合。
三、JavaScript中正則表達(dá)式的使用
在JavaScript 1.2版以后,JavaScript也支持正則表達(dá)式。
1、replace
replace在一個(gè)字符串中通過正則表達(dá)式查找替換相應(yīng)的內(nèi)容。replace并不改變?cè)瓉淼淖址皇侵匦律闪艘粋€(gè)新的字符串。如果需要執(zhí)行全局查找或忽略大小寫,那幺在正則表達(dá)式的最后添加g和i。
例:
re = /apples/gi;
str = “Apples are round, and apples are juicy.”;
newstr=str.replace(re, “oranges”);
document.write(newstr)
</SCRIPT>
結(jié)果是:”oranges are round, and oranges are juicy.”
例:
str = “Twas the night before Xmas…”;
newstr=str.replace(/xmas/i, “Christmas”);
document.write(newstr)
</SCRIPT>
結(jié)果是:”Twas the night before Christmas…”
例:
re = /(w+)s(w+)/;str = “John Smith”;
newstr = str.replace(re, “$2, $1”);
document.write(newstr)
</SCRIPT>
結(jié)果是:”Smith, John”.
2、search
search通過正則表達(dá)式查找相應(yīng)的字符串,只是判斷有無匹配的字符串。如果查找成功,search返回匹配串的位置,否則返回-1。
search(regexp)
function testinput(re, str){
if (str.search(re) != -1)
midstring = ” contains “;
else
midstring = ” does not contain “;
document.write (str + midstring + re.source);
}
testinput(/^[1-9]/i,”123″)
</SCRIPT>
3、match
match方法執(zhí)行全局查找,查找結(jié)果存放在一個(gè)數(shù)組里。
例一:
str = “For more information, see Chapter 3.4.5.1”;
re = /(chapter d+(.d)*)/i;
found = str.match(re);
document.write(found);
</SCRIPT>
顯示結(jié)果:Chapter 3.4.5.1,Chapter 3.4.5.1,.1
例二:
str = “abcDdcba”;
newArray = str.match(/d/gi);
document.write(newArray);
</SCRIPT>
顯示結(jié)果D, d.
四、示例
1 、判斷數(shù)字的正確性
<script language=”javascript” runat=”server”>
function isNumeric(strNumber) {
return (strNumber.search(/^(-|+)?d+(.d+)?$/) != -1);
}
function isUnsignedNumeric(strNumber) {
return (strNumber.search(/^d+(.d+)?$/) != -1);
}
function isInteger(strInteger) {
return (strInteger.search(/^(-|+)?d+$/) != -1);
}
function isUnsignedInteger(strInteger) {
return (strInteger.search(/^d+$/) != -1);
}
</script>
<HTML>
<BODY>
<b>判斷數(shù)字的正確性</b>
<%
Dim strTemp
strTemp = CStr(Request.Form(“inputstring”))
If strTemp = “” Then strTemp = “0”
%>
<TABLE BORDER=”1″ CELLPADDING=”4″ CELLSPACING=”2″>
<TR>
<TD ALIGN=”right”><B>原始字符串</B></TD>
<TD><%= strTemp %></TD>
</TR>
<TR>
<TD ALIGN=”right”><B>數(shù)字</B></TD>
<TD><%=isNumeric(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN=”right”><B>非負(fù)數(shù)字</B></TD>
<TD><%=isUnsignedNumeric(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN=”right”><B>整數(shù)</B></TD>
<TD><%=isInteger(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN=”right”><B>非負(fù)整數(shù)()</B></TD>
<TD><%=isUnsignedInteger(strTemp)%></TD>
</TR>
</TABLE>
<FORM ACTION=”<%=Request.ServerVariables(“SCRIPT_NAME”)%>” METHOD=”post”>
請(qǐng)輸入一個(gè)數(shù)字:<BR>
<INPUT TYPE=”text” NAME=”inputstring” SIZE=”50″></INPUT><BR>
<INPUT TYPE=”submit” Value=”提交”></INPUT><BR>
</FORM>
</BODY>
</HTML>
2、判斷Email地址的正確性
Function isemail(strng)
isemail = false
Dim regEx, Match
Set regEx = New RegExp
regEx.Pattern = “^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$”
regEx.IgnoreCase = True
Set Match = regEx.Execute(strng)
if match.count then isemail= true
End Function
%>
五、總結(jié)
上面我們介紹了正則表達(dá)式的基本概念,以及在VBScript和JavaScript中如何使用正則表達(dá)式,同時(shí),通過一些實(shí)例讓大家有了感性的認(rèn)識(shí)。正則表達(dá)式的應(yīng)用范圍很廣,能為大家解決很多實(shí)際中的問題。本文介紹的內(nèi)容只是一些初步的知識(shí),還有很多語法規(guī)則需要大家繼續(xù)學(xué)習(xí),在實(shí)踐中發(fā)現(xiàn)問題,解決問題。