1.重復的表標記
* 表示前面的字符要出現0次,1次,乃至多次,上面沒有封頂, 下面保底是0次,可以不出現。
+ 表示前面的字符要出現1次,多次,上面沒有封頂,但至少要有1次。
? 表示前面的字符要出現0次,1次,上面封頂是1次,下面保底是0次,可以不出現。
2.其他符號
\ 表示轉義
. 表示匹配任何單個字符,好象除了回車,記不清了,得查一下文檔。
^ 表示整個字符串以某字符開始,如^t,整個字符串這句話很重要,它只能是位於開頭。
$ 表示整個字符串以某字符結束,如f$,整個字符串這句話很重要,它只能是位於結尾。
[...] 表示括號中的任一字符
| 表示選擇符號,"gray|grey"可匹配 gray 或 grey.
() 表示操作的范圍和優先度, 如 "gr(a|e)y" 可以匹配 gray 或 grey.
{n} 匹配前面字符n次, {n,} n次或無限次, {n,m} 最少n次最多m次。
\s 任一空白字符
\S 任一非空白字符
\w 任一單詞字符
\W 任一非單詞字符
\d 任一數字
\D 任一非數字
3.提取中文信息的表達式。
Regex rx = new Regex("[\u4e00-\u9fa5]+");
4.提取雙引號之間的信息的表達式。
Regex rx = new Regex("\"[^\"]*\"");
注解:在[]中的^意思變了,不再是以某字符開始了,而是變為不能包含后面的字符了,這叫反義。
5.反義
有時需要查找不屬於某個能簡單定義的字符類的字符。比如想查找除了數字以外,其它任意字符都行的情況,這時需要用到反義:
表3.常用的反義代碼
代碼/語法 說明
\W 匹配任意不是字母,數字,下划線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou]
匹配除了aeiou這幾個字母以外的任意字符
6.提取雙引號之間的信息的表達式,第二種方法。
Regex rx = new Regex("\".*?\"");
注解: 在.*之后加一個?的作用是將正則表達式從貪婪模式改為懶惰模式。
7.貪婪與懶惰
當正則表達式中包含能接受重復的限定符時,通常的行為是(在使整個表達式能得到匹配的前提下)匹配盡可能多的字符。考慮這個表達式:a.*b,它將會匹配最長的以a開始,以b結束的字符串。如果用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱為貪婪匹配。
有時,我們更需要懶惰匹配,也就是匹配盡可能少的字符。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它后面加上一個問號?。這樣.*?就意味着匹配任意數量的重復,但是在能使整個匹配成功的前提下使用最少的重復。現在看看懶惰版的例子吧:
a.*?b匹配最短的,以a開始,以b結束的字符串。如果把它應用於aabab的話,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)。
為什么第一個匹配是aab(第一到第三個字符)而不是ab(第二到第三個字符)?簡單地說,因為正則表達式有另一條規則,比懶惰/貪婪規則的優先級更高:最先開始的匹配擁有最高的優先權——The match that begins earliest wins。
8.另外,藍驛軌跡還有一種匹配雙引號的方法,就是把引號轉成16進制數,具體請參考:http://www.cnblogs.com/twh/articles/1629752.html
Regex rx = new Regex("\u0022.*?\u0022");
9.提取xml配置文件中包含中文的信息,用於國際化代碼。
有可能在兩種地方出現包含中文的信息,屬性和節點值,因此,可以用雙引號匹配一次文件,提取出屬性值中包含的中文信息;然后,再用尖括號匹配一次文件,提取出節點值中包含的中文信息,正則 rx = new Regex(">.*<");
如果僅僅是匹配中文,用Regex rx = new Regex("[\u4e00-\u9fa5]+")即可,但如果中文中間夾雜着標點符號或者英文,那用這個就不靈了,可以換個思路,用IsMatch來判斷信息中是否包含中文來達到取舍的目的,示例如下:
Regex rxChinaCharacter= new Regex("[\u4e00-\u9fa5]+")
Regex rx = new Regex(">.*<");
System.Text.RegularExpressions.MatchCollectionmatchs = rx.Matches(input);
if (matchs.Count != 0)
{
foreach (Match m in matchs)
{
if (!rxChinaCharacter.IsMatch(m.Value)){
//符合包含中文的條件條件,可以留下來。
}
}
}
10.總結
^有兩種含義:
1.表示整個字符串以某字符開始,如^t,整個字符串這句話很重要,它只能是位於開頭。
2.放在[^t]里表示不能包含t字符。
?也有兩種含義:
1.表示前面的字符要出現0次,1次,上面封頂是1次,下面保底是0次,可以不出現。
2.將正則從貪婪模式改為懶惰模式。
$ 表示整個字符串以某字符結束,如f$,整個字符串這句話很重要,它只能是位於結尾,如assssbtattttb這個串讓 a[^a]*b$ 來匹配,就只能匹配后半截attttb, 如用^ a[^a]*b, 就只能匹配前半段assssb, 如果用^ a[^a]*b$來匹配,則根本什么都匹配不了。
推薦資料:
正則表達式30分鍾入門教程http://manual.phpv.net/regular_expression.html
C#正則表達式整理備忘
http://www.cnblogs.com/kissknife/archive/2008/03/23/1118423.html
正則表達式怎么匹配雙引號
http://www.cnblogs.com/twh/articles/1629752.html