Regex快速入門教程

來源:互聯網
上載者:User
教程|快速入門|入門教程|正則   首先,讓我們來瞭解一下究竟什麼是VBScript的“Regex”對象,我們先來看一段程式:

Function CheckExp(patrn, strng)
 Dim regEx, Match   ’ 建立變數。
 Set regEx = New RegExp ’ 建立Regex。
 regEx.Pattern = patrn ’ 設定模式。
 regEx.IgnoreCase = true ’ 設定是否區分字元大小寫。
 regEx.Global = True ’ 設定全域可用性。
 Matches = regEx.test(strng)     ’ 執行搜尋。
 CheckExp = matches
End Function


  在這段程式程式中,我們看到可以使用“New RegExp”來得到一個Regex對象,然後對這個對象進行正則匹配模板的賦值,也就是告訴Regex對象,你想要匹配一個什麼樣子的模板,然後使用方法Test來檢測待處理的資料究竟和我們給出的模版是否相匹配,如果不匹配,那就表明待處理的資料不是合法的資料,從而也就實現了資料合法性的校正,我們可以看出,使用一個設計合理的匹配模板,我們可以輕鬆的校正一批格式類似的資料資訊。

  當然,VBScript5.0中的“Regex”對象還有很多的其他的方法和屬性,比如方法Replace(),利用他我們就可以很快的實現現在網上很時髦的UBB風格的論壇以及BBS,這不在我們討論範圍之內,以後再加以論述,我們現在就看看在資料校正方面Regex對象常用的方法和屬性:

  常用方法: Execute 方法

  描述:對指定的字串執行Regex搜尋。

  文法:object.Execute(string)  Execute 方法的文法包括以下幾個部分:

  object:必需的。總是一個 RegExp 對象的名稱。

  string:必需的。要在其上執行Regex的文本字串。

  說明:Regex搜尋的設計模式是通過 RegExp 對象的 Pattern 來設定的。Execute 方法返回一個 Matches 集合,其中包含了在 string 中找到的每一個匹配的 Match 對象。如果未找到匹配,Execute 將返回空的 Matches 集合。

  Test方法

  描述:對指定的字串執行一個Regex搜尋,並返回一個 Boolean 值指示是否找到匹配的模式。

  文法:object.Test(string)

  Test 方法的文法包括以下幾個部分:

  object:必需的。總是一個 RegExp 對象的名稱。

  string:必需的。要執行Regex搜尋的文本字串。

  說明:Regex搜尋的實際模式是通過RegExp對象的Pattern屬性來設定的。RegExp.Global屬性對Test方法沒有影響。如果找到了匹配的模式,Test方法返回True;否則返回False。

  常用屬性: Global屬性

  描述:設定或返回一個 Boolean 值,該值指明在整個搜尋字串時模式是全部匹配還是只匹配第一個。

  文法:object.Global [= True | False ]

  object 參數總是 RegExp 對象。如果搜尋應用於整個字串,Global 屬性的值為 True,否則其值為 False。預設的設定為 True。

  IgnoreCase屬性

  描述:設定或返回一個Boolean值,指明模式搜尋是否區分大小寫。

  文法:object.IgnoreCase [= True | False ]

  object 參數總是一個 RegExp 對象。如果搜尋是區分大小寫,則 IgnoreCase 屬性為 False;否則為 True。預設值為 True。

  Pattern屬性

  描述:設定或返回被搜尋的Regex模式。 這是一個最重要的屬性,我們主要是設定這個屬性來實現資料校正的。

  文法:object.Pattern [= "searchstring"]

  Pattern 屬性的文法包含以下幾個部分:

  object:必需的。總是一個 RegExp 物件變數。

  searchstring:可選的。被搜尋的正則字串運算式。它可能包含設定部分表格中的各種Regex字元。

  設定:在書寫Regex的模式時使用了特殊的字元和序列。下表描述了可以使用的字元和序列,並給出了執行個體。

  字元描述: \:將下一個字元標記為特殊字元或字面值。例如"n"與字元"n"匹配。"\n"與分行符號匹配。序列"\\"與"\"匹配,"\("與"("匹配。

  ^ :匹配輸入的開始位置。

  $ :匹配輸入的結尾。

  * :匹配前一個字元零次或幾次。例如,"zo*"可以匹配"z"、"zoo"。

  + :匹配前一個字元一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。

  ? :匹配前一個字元零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。

  .:匹配分行符號以外的任何字元。

  (pattern) 與模式比對並記住匹配。匹配的子字串可以從作為結果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括弧字元(和 ),可使用"\(" 或 "\)"。

  x|y:匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。

  {n}:n 為非負的整數。匹配恰好n次。例如,"o{2}" 不能與 "Bob 中的 "o" 匹配,但是可以與"foooood"中的前兩個o匹配。

  {n,} :n 為非負的整數。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等價於"o+"。"o{0,}"等價於"o*"。

  {n,m} :m 和 n 為非負的整數。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三個o。"o{0,1}"等價於"o?"。

  [xyz] :一個字元集。與括弧中字元的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。

  [^xyz] :一個否定的字元集。匹配不在此括弧中的任何字元。例如,"[^abc]" 可以匹配"plain"中的"p".

  [a-z] :表示某個範圍內的字元。與指定區間內的任何字元匹配。例如,"[a-z]"匹配"a"與"z"之間的任何一個小寫字母字元。

  [^m-z] :否定的字元區間。與不在指定區間內的字元匹配。例如,"[m-z]"與不在"m"到"z"之間的任何字元匹配。

  \b :與單詞的邊界匹配,即單詞與空格之間的位置。例如,"er\b" 與"never"中的"er"匹配,但是不匹配"verb"中的"er"。

  \B :與非單詞邊界匹配。"ea*r\B"與"never early"中的"ear"匹配。

  \d :與一個數字字元匹配。等價於[0-9]。

  \D :與非數位字元匹配。等價於[^0-9]。

  \f :與分頁符匹配。

  \n :與分行符號字元匹配。

  \r :與斷行符號字元匹配。

  \s :與任何白字元匹配,包括空格、定位字元、分頁符等。等價於"[ \f\n\r\t\v]"。

  \S :與任何非空白的字元匹配。等價於"[^ \f\n\r\t\v]"。

  \t :與定位字元匹配。

  \v :與垂直定位字元匹配。

  \w :與任何單詞字元匹配,包括底線。等價於"[A-Za-z0-9_]"。

  \W :與任何非單詞字元匹配。等價於"[^A-Za-z0-9_]"。

  \num :匹配 num個,其中 num 為一個正整數。引用回到記住的匹配。例如,"(.)\1"匹配兩個連續的相同的字元。

  \n:匹配 n,其中n 是一個八進位換碼值。八進位換碼值必須是 1, 2 或 3 個數字長。

  例如,"\11" 和 "\011" 都與一個定位字元匹配。"\0011"等價於"\001" 與 "1"。八進位換碼值不得超過 256。否則,只有前兩個字元被視為運算式的一部分。允許在Regex中使用ASCII碼。

  \xn:匹配n,其中n是一個十六進位的換碼值。十六進位換碼值必須恰好為兩個數字長。例如,"\x41"匹配"A"。"\x041"等價於"\x04" 和 "1"。允許在Regex中使用 ASCII 碼。

   好了,常用的方法和屬性就是這些了,上面的文法介紹的已經很詳細了,我們就沒有必要在羅嗦了,接下來我們來看看在具體的例子裡面如何使用這些方法和屬性來校正資料的合法性,我們還是舉個例子吧,比如,我們想要對使用者輸入的電子郵件進行校正,那麼,什麼樣的資料才算是一個合法的電子郵件呢?我可以這樣輸入:uestc95@263.net,當然我也會這樣輸入:xxx@yyy.com.cn,但是這樣的輸入就是非法的:xxx@@com.cn或者@xxx.com.cn,等等,所以我們得出一個合法的電子郵件地址至少應當滿足以下幾個條件:

  1. 必須包含一個並且只有一個符號“@”

  2. 必須包含至少一個至多三個符號“.”

  3. 第一個字元不得是“@”或者“.”

  4. 不允許出現“@.”或者.@

  5. 結尾不得是字元“@”或者“.”

  所以根據以上的原則和上面表中的文法,我們很容易的就可以得到需要的模板如下:"(\w)+[@]{1}(\w)+[.]{1,3}(\w)+"

  接下來我們仔細分析一下這個模板,首先“\w”表示郵件的開始字元只能是包含底線的單詞字元,這樣,滿足了第三個條件;“[@]{1}”表示在電子郵件中應當匹配並且只能匹配一次字元“@”,滿足了條件一;同樣的“[.]{1,3}”表示在電子郵件中至少匹配1個至多匹配3個字元“.” ,滿足了第二個條件;模板最後的“(\w)+”表示結尾的字元只能是包含底線在內的單詞字元,滿足了條件五;模板中間的“(\w)+”滿足了條件四。

  然後,我們就直接調用剛才的那個函數CheckExp("(\w)+[@]{1}(\w)+[.]{1}(\w)+",待校正的字串)就好了,如果返回True就表示資料是合法的,否則就是不正確的,怎麼樣,簡單吧。我們還可以寫出來校正社會安全號碼碼的模板:"([0-9]){15}";校正URL的模板:"^http://{1}((\w)+[.]){1,3}"等等;我們可以看到,這些模板為我們提供了很好的可重利用的模組,利用自己或者別人提供的各種模板,我們就可以方便快捷的進行資料的合法性校正了,相信你一定會寫出非常通用的模板的。

  這樣,我們只要定製不同的模板,就可以實現對不同資料的合法性校正了。所以,Regex對象中最重要的屬性就是:“Pattern”屬性,只要真正掌握了這個屬性,才可以自由的運用Regex對象來為我們的資料校正進行服務。

  下面我們就介紹這三個對象和集合。

  1、RegExp對象是最重要的一個對象,它有幾個屬性,其中:

  ○Global 屬性,設定或返回一個 Boolean 值,該值指明在整個搜尋字串時模式是全部匹配還是只匹配第一個。如果搜尋應用於整個字串,Global 屬性的值為 True,否則其值為 False。預設的設定為 False。

  ○IgnoreCase 屬性,設定或返回一個Boolean值,指明模式搜尋是否區分大小寫。如果搜尋是區分大小寫,則 IgnoreCase 屬性為 False;否則為 True。預設值為 False。

  ○Pattern 屬性,設定或返回被搜尋的Regex模式。必選項。總是一個 RegExp 物件變數。

  2、Match 對象

  匹配搜尋的結果是存放在Match對象中,提供了對Regex匹配的唯讀屬性的訪問。 Match 對象只能通過 RegExp 對象的 Execute 方法來建立,該方法實際上返回了 Match 對象的集合。所有的 Match 對象屬性都是唯讀。在執行Regex時,可能產生零個或多個 Match 對象。每個 Match 對象提供了被Regex搜尋找到的字串的訪問、字串的長度,以及找到匹配的索引位置等。

  ○FirstIndex 屬性,返回在搜尋字串中匹配的位置。FirstIndex 屬性使用從零起算的位移量,該位移量是相對於搜尋字串的起始位置而言的。換言之,字串中的第一個字元被標識為字元 0

  ○Length 屬性,返回在字串搜尋中找到的匹配的長度。

  ○Value 屬性,返回在一個搜尋字串中找到的匹配的值或文本。

  3、Matches 集合

  Regex Match 對象的集合。Matches 集合中包含若干獨立的 Match 對象,只能使用 RegExp 對象的 Execute 方法來建立之。與獨立的 Match 對象屬性相同,Matches `集合的一個屬性是唯讀。在執行Regex時,可能產生零個或多個 Match 對象。每個 Match 對象都提供了與Regex匹配的字串的訪問入口、字串的長度,以及標識匹配位置的索引。

  學習了這三個對象和集合,如何應用於字串的判斷和替換呢?regExp對象的三個方法正好解決了這個問題,它們是Replace方法、Test方法和Execute方法。

  1、Replace 方法

  替換在Regex尋找中找到的文本。我們還是先看個例子:下面的例子說明了 Replace 方法的用法。

<%
 Function ReplaceTest(patrn, replStr)
  Dim regEx, str1 ’ 建立變數。
  str1 = "The quick brown fox jumped over the lazy dog."
  Set regEx = New RegExp ’ 建立Regex。
  regEx.Pattern = patrn ’ 設定模式。
  regEx.IgnoreCase = True ’ 設定是否區分大小寫。
  ReplaceTest = regEx.Replace(str1, replStr) ’ 作替換。
 End Function
 Response.write ReplaceTest("fox", "cat") & "<BR>" ’ 將 ’fox’ 替換為 ’cat’。
 Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ’ 交換詞對.
%>


  2、Test 方法

  對指定的字串執行一個Regex搜尋,並返回一個 Boolean 值指示是否找到匹配的模式。Regex搜尋的實際模式是通過RegExp對象的Pattern屬性來設定的。RegExp.Global屬性對Test方法沒有影響。

  如果找到了匹配的模式,Test方法返回True;否則返回False。下面的代碼說明了Test 方法的用法。

<%
Function RegExpTest(patrn, strng)
 Dim regEx, retVal ’ 建立變數。
 Set regEx = New RegExp ’ 建立Regex。
 regEx.Pattern = patrn ’ 設定模式。
 regEx.IgnoreCase = False ’ 設定是否區分大小寫。
 retVal = regEx.Test(strng) ’ 執行搜尋測試。
 If retVal Then
  RegExpTest = "找到一個或多個匹配。"
 Else
  RegExpTest = "未找到匹配。"
 End If
End Function
Response.write RegExpTest("is.", "IS1 is2 IS3 is4")
%>


  3、Execute 方法

  對指定的字串執行Regex搜尋。Regex搜尋的設計模式是通過 RegExp 對象的 Pattern 來設定的。

  Execute 方法返回一個 Matches 集合,其中包含了在 string 中找到的每一個匹配的 Match 對象。如果未找到匹配,Execute 將返回空的 Matches 集合。

  在JavaScript 1.2版以後,JavaScript也支援Regex。

  1、replace

  replace在一個字串中通過Regex尋找替換相應的內容。replace並不改變原來的字串,只是重建了一個新的字串。如果需要執行全域尋找或忽略大小寫,那麼在Regex的最後添加g和i。

  例:

<SCRIPT>
 re = /apples/gi;
 str = "Apples are round, and apples are juicy.";
 newstr=str.replace(re, "oranges");
 document.write(newstr)
</SCRIPT>


  結果是:"oranges are round, and oranges are juicy."

  例:

<SCRIPT>
str = "Twas the night before Xmas...";
newstr=str.replace(/xmas/i, "Christmas");
document.write(newstr)
</SCRIPT>


  結果是:"Twas the night before Christmas..."

  例:

<SCRIPT>
re = /(\w+)\s(\w+)/;str = "John Smith";
newstr = str.replace(re, "$2, $1");
document.write(newstr)
</SCRIPT>


  結果是:"Smith, John".

  2、search

  search通過Regex尋找相應的字串,只是判斷有無匹配的字串。如果尋找成功,search返回匹配串的位置,否則返回-1。
         search(regexp)

<SCRIPT>
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方法執行全域尋找,尋找結果存放在一個數組裡。

  例一:

<SCRIPT>
str = "For more information, see Chapter 3.4.5.1";
re = /(chapter \d+(\.\d)*)/i;
found = str.match(re);
document.write(found);
</SCRIPT>


  顯示結果:Chapter 3.4.5.1,Chapter 3.4.5.1,.1

  例二:

<SCRIPT>
str = "abcDdcba";
newArray = str.match(/d/gi);
document.write(newArray);
</SCRIPT>


  顯示結果D, d.

  1 、判斷數位正確性

<%@ Language=VBScript %>
<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>判斷數位正確性</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>數字</B></TD>
<TD><%=isNumeric(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN="right"><B>非負數字</B></TD>
<TD><%=isUnsignedNumeric(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN="right"><B>整數</B></TD>
<TD><%=isInteger(strTemp)%></TD>
</TR>
<TR>
<TD ALIGN="right"><B>非負整數()</B></TD>
<TD><%=isUnsignedInteger(strTemp)%></TD>
</TR>
</TABLE>
<FORM ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>" METHOD="post">
請輸入一個數字:<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
%>



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。