首先,我們先看幾個實際的例子:
1. 驗證輸入字符是否
javascript:
var ex = "^w+$";
var re = new RegExp(ex,"i");
return re.test(str);
VBScript
Dim regEx,flag,ex
ex = "^w+$"
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True
regEx.Pattern = ex
flag = regEx.Test( str )
C#
System.String ex = @"^w+$";
System.Text.RegularExpressions.Regex reg = new Regex( ex );
bool flag = reg.IsMatch( str );
2. 驗證郵件格式
C#
System.String ex = @"^w+@w+.w+$";
System.Text.RegularExpressions.Regex reg = new Regex( ex );
bool flag = reg.IsMatch( str );
3. 更改日期的格式(用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式)
C#
String MDYToDMY(String input)
{
return Regex.Replace(input,
"b(?d{1,2})/(?d{1,2})/(?d{2,4})b",
"${day}-${month}-${year}");
}
4. 從 URL 提取協議和端口號
C#
String Extension(String url)
{
Regex r = new Regex(@"^(?w+)://[^/]+?(?:d+)?/",
RegexOptions.Compiled);
return r.Match(url).Result("${proto}${port}");
}
這裡的例子可能是我們在網頁開發中,通常會碰到的一些正則表達式,尤其在第一個例子中,給出了使用javascript,vbScript,C#等不同語言的實現方式,大家不難看出,對於不同的語言來說,正則表達式沒有區別,只是正則表達式的實現類不同而已。而如何發揮正則表達式的公用,也要看實現類的支持。
(摘自msdn: Microsoft .NET 框架 SDK 提供大量的正則表達式工具,使您能夠高效地創建、比較和修改字符串,以及迅速地分析大量文本和數據以搜索、移除和替換文本模式。ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconregularexpressionslanguageelements.htm)
下面我們逐個來分析這些例子:
1-2,這兩個例子很簡單,只是簡單的驗證字符串是否符合正則表達式規定的格式,其中使用的語法,在第一篇文章中都已經介紹過了,這裡做一下簡單的描述。
第1個例子的表達式: ^w+$
^ -- 表示限定匹配開始於字符串的開始
w – 表示匹配英文字符
+ -- 表示匹配字符出現1次或多次
$ -- 表示匹配字符到字符串結尾處結束
驗證形如asgasdfs的字符串
第2個例子的表達式: ^w+@w+.w+$
^ -- 表示限定匹配開始於字符串的開始
w – 表示匹配英文字符
+ -- 表示匹配字符出現1次或多次
@ -- 匹配普通字符@
. – 匹配普通字符.(注意.為特殊字符,因此要加上轉譯)
$ -- 表示匹配字符到字符串結尾處結束
驗證形如[email protected]的郵件格式
第3 個例子中,使用了替換,因此,我們還是先來看看正則表達式中替換的定義:
(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpconsubstitutions.htm)
替換
字符
含義
$123
替換由組號 123(十進制)匹配的最後一個子字符串。
${name}
替換由 (? ) 組匹配的最後一個子字符串。
$$
替換單個“$”字符。
$&
替換完全匹配本身的一個副本。
$`
替換匹配前的輸入字符串的所有文本。
$'
替換匹配後的輸入字符串的所有文本。
$+
替換最後捕獲的組。
$_
替換整個輸入字符串。
分組構造
(ms-help://MS.VSCC/MS.MSDNVS.2052/cpgenref/html/cpcongroupingconstructs.htm)
分組構造
定義
( )
捕獲匹配的子字符串(或非捕獲組;有關更多信息,請參閱正則表達式選項中的 ExplicitCapture 選項。)使用 () 的捕獲根據左括號的順序從 1 開始自動編號。捕獲元素編號為零的第一個捕獲是由整個正則表達式模式匹配的文本。
(?<name> )
將匹配的子字符串捕獲到一個組名稱或編號名稱中。用於 name 的字符串不能包含任何標點符號,並且不能以數字開頭。可以使用單引號替代尖括號,例如 (?'name')。
(?<name1-name2> )
平衡組定義。刪除先前定義的 name2 組的定義並在 name1 組中存儲先前定義的 name2 組和當前組之間的間隔。如果未定義 name2 組,則匹配將回溯。由於刪除 name2 的最後一個定義會顯示 name2 的先前定義,因此該構造允許將 name2 組的捕獲堆棧用作計數器以跟蹤嵌套構造(如括號)。在此構造中,name1 是可選的。可以使用單引號替代尖括號,例如 (?'name1-name2')。
(?: )
非捕獲組。
(?imnsx-imnsx: )
應用或禁用子表達式中指定的選項。例如,(?i-s: ) 將打開不區分大小寫並禁用單行模式。有關更多信息,請參閱正則表達式選項。
(?= )
零寬度正預測先行斷言。僅當子表達式在此位置的右側匹配時才繼續匹配。例如,w+(?=d) 與後跟數字的單詞匹配,而不與該數字匹配。此構造不會回溯。
(?! )
零寬度負預測先行斷言。僅當子表達式不在此位置的右側匹配時才繼續匹配。例如,b(?!un)w+b 與不以 un 開頭的單詞匹配。
(?<= )
零寬度正回顧後發斷言。僅當子表達式在此位置的左側匹配時才繼續匹配。例如,(?<=19)99 與跟在 19 後面的 99 的實例匹配。此構造不會回溯。
(?
零寬度負回顧後發斷言。僅當子表達式不在此位置的左側匹配時才繼續匹配。
(?> )
非回溯子表達式(也稱為貪婪子表達式)。該子表達式僅完全匹配一次,然後就不會逐段參與回溯了。(也就是說,該子表達式僅與可由該子表達式單獨匹配的字符串匹配。)
我們還是先簡單的了解一下這兩個概念:
分組構造:
最基本的構造方式就是(),在左右括號中括起來的部分,就是一個分組;
更進一步的分組就是形如:(?<name> )的分組方式,這種方式與第一種方式的不同點,就是對分組的部分進行了命名,這樣就可以通過該組的命名來獲取信息;
(還有形如(?= )等等的分組構造,我們這篇的例子中也沒有使用到,下次我們在來介紹)
替換:
上面提到了兩種基本的構造分組方式()以及(?<name> ),通過這兩種分組方式,我們可以得到形如$1,${name}的匹配結果。
這樣說,可能概念上還是有些模糊,我們還是結合上面的例子來說:
第三個例子的正則表達式為:b(?d{1,2})/(?d{1,2})/(?d{2,4})b
(解釋一下,為什麼這裡都是一起用:這裡是C#的例子,在C#語言中是轉譯字符,要想字符串中的不轉譯,就需要使用或者在整個字符串的開始加上@標記,即上面等價與
@”b(?d{1,2})/(?d{1,2})/(?d{2,4}b”)
b -- 是一種特殊情況。在正則表達式中,除了在 [] 字符類中表示退格符以外,b 表示字邊界(在 w 和 W 字符之間)。在替換模式中,b 始終表示退格符
(?d{1,2}) – 構造一個名為month的分組,這個分組匹配一個長度為1-2的數字
/ -- 匹配普通的/字符
(?d{1,2}) --構造一個名為day的分組,這個分組匹配一個長度為1-2的數字
/ -- 匹配普通的/字符
(?d{2,4}b”) --構造一個名為year的分組,這個分組匹配一個長度為2-4的數字
這裡還不能夠看出這些分組的作用,我們接著看這一句
${day}-${month}-${year}
${day} – 獲得上面構造的名為day的分組匹配後的信息
- -- 普通的-字符
${month} --獲得上面構造的名為month的分組匹配後的信息
- -- 普通的-字符
${year} --獲得上面構造的名為year的分組匹配後的信息
舉例來說:
將形如04/02/2003的日期使用例3種的方法替換
(?d{1,2}) 分組將匹配到04由${month}得到這個匹配值
(?d{1,2}) 分組將匹配到02由${day}得到這個匹配值
(?d{1,2}) 分組將匹配到2003由${year}得到這個匹配值
了解了這個例子後,我們在來看第4個例子就很簡單了。
第4個例子的正則
^(?w+)://[^/]+?(?:d+)?/
^ -- 表示限定匹配開始於字符串的開始
(?w+) – 構造一個名為proto的分組,匹配一個或多個字母
: -- 普通的:字符
// -- 匹配兩個/字符
[^/] – 表示這裡不允許是/字符
+? – 表示指定盡可能少地使用重復但至少使用一次匹配
(?:d+) – 構造一個名為port的分組,匹配形如:2134(冒號+一個或多個數字)
? – 表示匹配字符出現0次或1次
/ -- 匹配/字符
最後通過${proto}${port}來獲取兩個分組構造的匹配內容
(有關Regex對象的用法,參考
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTextRegularExpressionsRegexMembersTopic.htm)