正規表示式通常包含字母文字(literaltext)和元字元(metacharacter)
字母文字指的是普通文字如"abcde"可匹配字串中任何包含"abcde"的字串。
元字元則更加靈活運用通用的表示式匹配所有符合此表示式規律的字串。
c#正規表示式語法一、
匹配單個字元 ——從中選擇乙個字元匹配
中間支援的型別:單詞字元([ae])、非單詞字元([!?,;@#$*])、字母範圍([a-z])、數字範圍([0])
eg.正規表示式[ae]ffect
可匹配字串 affect,effect
(此例中"[ae]"為元字元,"ffect"為字母文字)
注意:1.要在字元類中匹配連字元,那麼把連字符號作為第乙個字元列出即可。
2.可以在單個正規表示式中包含多個字元類。
eg.[01][0-9]:[0-5][0-9][ap]m可以用來匹配如12:59pm格式的所有時間
^——排除某些字元(在中表此意,還可表示字串的開頭)
eg.正規表示式m[^a]t
可匹配字串
不可匹配字串 met,mit,m&t……mat
c#正規表示式語法二、
匹配特殊字元 可以使用的特殊字元:
\t——匹配製表符 \r——匹配硬回車符 \f——匹配換頁符 \n——匹配換行符 描述表示字元類的元字元:
.——匹配任何除了\n以外的字元(或者在單行模式中的任何字元) \w——匹配任何單詞字元(任何字母或數字)
\w——匹配任何非單詞字元(除了字母和數字以外的任何字元) \s——匹配任何空白字元(包括空格、換行、製表符等)
\s——匹配任何非空白字元(除了空格、換行、製表符等的任何字元) \d——匹配任何數字字元(0~9的數字)
\d——匹配任何非數字字元(除了0~9以外的任何字元) 表示字串中字元位置: ^——匹配字串的開頭(或者多行模式下行的開頭)。
$——匹配字串的結尾,或者是字串結尾「\n」之前的最後乙個字元,或者是多行模式中的行結尾。
\a——匹配字串的開頭(忽略多行模式) \z——匹配字串的結尾或字串結尾「\n」之前的最後乙個字元(忽略多行模式)。
\z——匹配字串的結尾。 \g——匹配當前搜尋開始的位置。 \b——匹配單詞的邊界。 \b——匹配單詞的非邊界。
注意:1.句點字元(.)特別有用。可以用它來表示任何乙個字元。
eg.正規表示式01.17.84
可匹配字串 01/17/84,01-17-84,011784,01.17.84
2.可以使用\b匹配單詞的邊界
eg.正規表示式
可匹配字串 \blet\blet
不可匹配字串letter,hamlet
3.\a和\z在確保字串所包含的是某個表示式,而不是其他內容時很用。
eg.要判斷text控制項是否包含單詞"sophia",而不含任何額外的字元、換行符或者空白。
\asophia\z
4.句點字元(.)具有特殊的含義,若要表示字母字元本身的含義,在前面加乙個反斜槓:\.
c#正規表示式語法三、
匹配二選一的字串行
|——匹配二選一
eg.正規表示式col(o|ou)r
可匹配字串 color,colour
注意:\b(bill|ted)和\bbill|ted是不同的。
後者還可以匹配"malted"因為\b元字元只應用於"bill"。
c#正規表示式語法四、
用量詞匹配 *——匹配0次或多次 +——匹配1次或多次 ?——匹配0次或1次 ——恰好匹配n次 ——至少匹配n次 ——至少匹配n次,
但不多於m次
eg.正規表示式brothers?
可匹配字串 brother,brothers
eg.正規表示式\bp\d
可匹配字串 \b以p開頭,且後跟3~5個數字結尾
注意:也可以把量詞與()一起使用,以便把該量詞應用到整個字母序列。
eg.正規表示式(the)?schoolisbeautiful.
可匹配字串 schoolisbeautiful,theschoolisbeautiful.
c#正規表示式語法五、
識別正規表示式和貪婪 有些量詞是貪婪的(greedy).他們會盡可能多的匹配字元。
如量詞*匹配0個或多個字元。假設要匹配字串中任何html標籤。你可能會用如下正規表示式:
<.*>
現有字串aquantifiercanbegreedy
結果<.*>把quantifiercanbegreedy都匹配上了。
要解決該問題,需要與量詞一起使用乙個特殊的非貪婪字元「?」,因此表示式變化如下:
<.*?>
這樣就可以正確匹配、、、。
?能強制量詞盡可能少地匹配字元,?還可以用在以下幾個量詞中:
*?——非貪婪的量詞* +?——非貪婪的量詞+ ??——非貪婪的量詞? ?——非貪婪的量詞 ?——非貪婪的量詞
?——非貪婪的量詞
c#正規表示式語法六、
捕獲和反向引用 捕獲組(capturegroup)就像是正規表示式中的變數。
捕獲組可以捕獲正規表示式中的字元模式,並且由正規表示式後面的編號或名稱來引用改模式。
()——用來捕獲其中的字串
\數字——用編號來引用
eg.正規表示式 (\w)(\w)\2\1
可匹配字串abba
注意:1.反向引用用來匹配html標籤非常有效如<(\w+)>可以匹配等類似格式的標籤。
2.預設情況下,只要使用圓括號,就會捕獲圓括號內所包含的字元,可以使用n選項來禁用這個預設行為(在第7條裡會詳細介紹),
或者新增?:到圓括號中。eg.(?:sophia)或(?n:sophia)此時不會捕獲sophia。
(?《捕獲組名稱》)\k《捕獲組名稱》——用名稱來引用
eg.正規表示式(?\w)abc\k
可匹配字串 xabcx
注意:在替換模式中使用捕獲組的格式略有不同,要用$1、$2等來按數值引用捕獲,用$等名稱來按名稱引用捕獲組
c#正規表示式語法七、
設定正規表示式的選項
eg.stringstr="sophia"
regexobjregex=newregex("(.*?)");
response.write(objregex.replace(str,"$2"));
i——所執行的匹配是不區分大小寫的(.net中的屬性為ignorecase) m——指定多行模式(.net中的屬性為multiline)
n——只捕獲顯示命名或編號的組(.net中的屬性為explicitcapture) c——編譯正規表示式,這樣會產生較快的執行速度,但啟動會變慢(.net中的屬性為compiled)
s——指定單行模式(.net中的屬性為singleline) x——消除非轉義空白字元和注釋(.net中的屬性為ignorepatternwhitespace)
r——搜尋從右到左進行(.net中的屬性為righttoleft) -——表示禁用。
eg.(?im-r:sophia)允許不區分大小寫匹配sophia,使用多行模式,但禁用了從右到左的匹配。
注意:1.m會影響如何解析起始元字元(^)和結束元字元($)。
在預設情況^和$只匹配整個字串的開頭,即使字串包含多行文字。如果啟用了m,那麼它們就可以匹配每行文字的開頭和結尾。
2.s會影響如何解析句點元字元(.)。通常乙個句點能匹配除了換行符以外的所有字元。但在單行模式下,句點也能匹配乙個換行符。
實際工作使用總結:
1.有時需要匹配從網路上獲取的html字串,字串中包含各種不同的字元,包括\t \r \n 等,使用 . 無法匹配 \n,故使用 [\s\s] 可代替匹配所有字元
2.資料的提取。
如:string str = @"zhangsan";
regex re = @"(\s*)";
string uid = re.match(str).groups[1].value;
string uname = re.match(str).groups[2].value;
要匹配的資料加上小括弧,就可以使用match().groups來提取其中的資料
groups中的資料為:groups[0] 匹配的整個字串,即:@"zhangsan";
從序號1開始按順序為字串中使用小括弧括起來的要提取的資料
3.有多個匹配資料時的規則
string str = @"zhangsan
gsdferf";
使用 @"\s*這樣的匹配方式,得到的是整個字串,匹配的為字串的最後乙個
要匹配第乙個,就要使用這樣的方式@"\s*
?4.程式中使用正規表示式通常會使用@來取消轉義字元,這時候如果字串中本身有 " 的話, 也無法正常轉義,這時候把 " 使用 "" 來代替就好了,同時字串中原有的 * ? 等字元要使用 \* \?等以標識其不是作為正規表示式符號來使用
正規表示式 三
標題 正規表示式 三 dragontt 原作 關鍵字正規表示式 前面的文章中,介紹了正規表示式的基本語法,以及一些簡單的例子。但這些並不是我們會遇到的全部問題,有些時候我們不得不編寫一些較為複雜的正規表示式來解決我們的實際問題。這裡,我先提幾個問題,然後,我們逐個運用正規表示式的知識來解決。1 符合...
正規表示式(三)
目錄 一 子表示式 二 正向預查 三 例項 概念 正規表示式中將小括號包裹的部分稱為子表示式。正規表示式含有子表示式時,執行match 正規表示式不能帶修飾符g 或exec方法時,所有子表示式的匹配字串會作為乙個個陣列元素插入到返回結果的末尾。var str abcdefg var reg a bc...
正規表示式 三
能夠於 多種字元 匹配的表示式 正規表示式中的一些表達方法,可以匹配 多個字元 其中的任意乙個字元,比如,表示式 d 可以匹配任意乙個數字。雖然可以匹配其中任意字元,但是只能是乙個,不是多個,這就好比撲克牌時候,大熊澳網可以代替任意一張牌,但是只能代替一張牌。匹配多種字元 1 表示式可匹配 d任意乙...