青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Jounior

once setback,once inspiration,once self-awareness
重要的是這個(gè)磨練過(guò)程,而不是結(jié)果,要的是你粗壯的腿,而不是你身上背的那袋鹽巴

 

.net中的正則表達(dá)式使用高級(jí)技巧

reference :http://www.cnblogs.com/thinhunan/archive/2007/08/21/339316.html
.net中的正則表達(dá)式使用高級(jí)技巧

前言

一、本系列文章不講述基本的正則語(yǔ)法,這些可以在微軟的 JS 幫助文檔中找到,也可以 Google 一下
二、寫系列文章的原因
1
、正則很有用,而且經(jīng)常要用
2
、正則的一些高級(jí)用法有相當(dāng)一部分人還沒(méi)有理解和掌握
3
、剛好又在網(wǎng)上看到了一篇文章錯(cuò)誤的使用了正則式,使我有了寫本文的沖動(dòng)
4 、本系列文章的大部分知識(shí)可同時(shí)適用于 .net 語(yǔ)言, JavaScript

三、本系列文章特點(diǎn):盡量使用小例子來(lái)說(shuō)明相對(duì)難懂而很多正則書籍都沒(méi)有說(shuō)清的正則語(yǔ)法
四、本系列文章內(nèi)容:替換的高級(jí)語(yǔ)法,內(nèi)聯(lián)表達(dá)式選項(xiàng),組,反向引用,正聲明,負(fù)聲明,正反聲明,負(fù)反聲明,非回溯匹配,判斷式, .net 正則引擎特點(diǎn)等 ?

?


因?yàn)?/font>
.net 的基本正則語(yǔ)法和 Perl5 基本相同,所以基本語(yǔ)法你可以去下載一下 M$ JS 幫助文檔,上面有詳細(xì)的說(shuō)明 \d 表示什么, {,5} 表示什么, \[ 表示什么……,這里我只想提醒大家一點(diǎn),為了避免和反向引用相沖突,在你用 \nn 表示八進(jìn)制的 ASCII 碼時(shí),請(qǐng)?jiān)?/span> \ 后加 0 就是說(shuō),\40在表示ASCII碼時(shí),請(qǐng)這樣寫\040

替換

Regex 類有一個(gè)靜態(tài)的 Replace 方法,其實(shí)例也有一個(gè) Replace 方法,這個(gè)方法很強(qiáng)大,因?yàn)樗梢詡魅胍粋€(gè) delegate ,這樣,你可以自定義每次捕獲匹配時(shí),如何處理捕獲的內(nèi)容。 ?

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " 1?12?3?5 "
;
????????????s?
= ?Regex.Replace(s, @" \d+ " , new ?MatchEvaluator(CorrectString),RegexOptions.Compiled |
RegexOptions.IgnoreCase);
????????????Console.WriteLine(s);
????????????Console.ReadLine();
????????}

????????
private ? static ? string
?CorrectString(Match?match)
????????
{
????????????
string ?matchValue? =
?match.Value;
????????????
if (matchValue.Length? == ? 1
)
????????????????matchValue?
= ? " 0 " ? +
?matchValue;
????????????
return
?matchValue;
????????}

以上這段代碼說(shuō)明了如果使用 delegate MatchEvaluator 來(lái)處理正則的 Match 結(jié)果,該代碼返回 "01 12 03 05" Replace 方法除了使用 delegate 來(lái)處理捕獲的 Match ,還可以用字符串來(lái)替換 Match 的結(jié)果,而用字符串來(lái)替換 Match 結(jié)果除了把 Match 結(jié)果靜態(tài)的替換成一個(gè)固定的文本外,還可以使用以下語(yǔ)法來(lái)更方便的實(shí)現(xiàn)你需要的功能:

$number

把匹配的第 number 組替換成替換表達(dá)式,還有這句話怎么寫也表達(dá)不清楚意思,還是來(lái)個(gè)例子吧:

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " 1?12?3?5 "
;
????????????s?
= ?Regex.Replace(s, @" (\d+)(?#這個(gè)是注釋) " , " 0$1 " ,RegexOptions.Compiled |
RegexOptions.IgnoreCase);
????????????Console.WriteLine(s);
????????????Console.ReadLine();
????????}

這段代碼返回的是 01 012 03 05

就是說(shuō),對(duì)組一的每個(gè)匹配結(jié)果都用 "0$1" 這個(gè)表達(dá)式來(lái)替換, "0$1" "$1" 由組 1 匹配的結(jié)果代入

${name}

把匹配的組名為 "name" 的組替換成表達(dá)式,

上例的 Regex expression 改成 @"(?<name>\d+)(?# 這個(gè)是注釋 )" 后面的替換式改為 "0${name}" 結(jié)果是一樣的

$$ ??

$ 的轉(zhuǎn)義符,如上例表達(dá)式改成 @"(?<name>\d+)(?# 這個(gè)是注釋 )" "$$${name}" ,則結(jié)果為 "$1 $12 $3 $5"

$&

替換整個(gè)匹配

$`

替換匹配前的字符

$'

替換匹配后的字符

$+

替換最后匹配的組

$_

替換整個(gè)字符串

后面的選項(xiàng),大家自己寫個(gè)例子體味一下。

* , 上例中的 (?# 這個(gè)是注釋 ) 說(shuō)明了正則的內(nèi)聯(lián)注釋語(yǔ)法為 (?#)


表達(dá)項(xiàng)選項(xiàng)

正則表達(dá)式選項(xiàng) RegexOptions 有如下一下選項(xiàng),詳細(xì)說(shuō)明請(qǐng)參考聯(lián)機(jī)幫助

RegexOptions 枚舉值

內(nèi)聯(lián)標(biāo)志

簡(jiǎn)單說(shuō)明

ExplicitCapture

n

只有定義了命名或編號(hào)的組才捕獲

IgnoreCase

i

不區(qū)分大小寫

IgnorePatternWhitespace

x

消除模式中的非轉(zhuǎn)義空白并啟用由 # 標(biāo)記的注釋。

MultiLine

m

多行模式,其原理是修改了 ^ $ 的含義

SingleLine

s

單行模式,和 MultiLine 相對(duì)應(yīng)

這里我提到內(nèi)聯(lián)標(biāo)志,是因?yàn)橄鄬?duì)于用 RegexOptions new Regex 時(shí)定義 Regex 表達(dá)式的全局選項(xiàng)來(lái)說(shuō),內(nèi)聯(lián)標(biāo)志可以更小粒度(以組為單位)的定義匹配選項(xiàng),從而更方便表達(dá)我們的思想

語(yǔ)法是這樣的: (?i:expression) 為定義一個(gè)選項(xiàng), (?-i:expression) 為刪除一個(gè)選項(xiàng), (?i-s:expression) 則定義 i ,刪除 s, 是的,我們可以一次定義很多個(gè)選項(xiàng)。這樣,通過(guò)內(nèi)聯(lián)選項(xiàng),你就可以在一個(gè) Regex 中定義一個(gè)組為匹分大小寫的,一個(gè)組不匹分大小寫的,是不是很方便呢 ?

更多精彩內(nèi)容,請(qǐng)看下回分解,

下一篇: .net中的正則表達(dá)式使用高級(jí)技巧 (二) ??
???????????????
.net中的正則表達(dá)式使用高級(jí)技巧 (三) ?
??????????????? .net中的正則表達(dá)式使用高級(jí)技巧 (四)

正則表達(dá)式中的組是很重要的一個(gè)概念,它是我們通向高級(jí)正則應(yīng)用的的橋梁

組的概念

一個(gè)正則表達(dá)式匹配結(jié)果可以分成多個(gè)部分,這就是組 (Group) 的目的。能夠靈活的使用組后,你會(huì)發(fā)現(xiàn) Regex 真是很方便,也很強(qiáng)大。

先舉個(gè)例子 ??

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " 2005-2-21 "
;
????????????Regex?reg?
= ? new ?Regex( @" (?<y>\d{4})-(?<m>\d{1,2})-(?<d>\d{1,2}) "
,RegexOptions.Compiled);
????????????Match?match?
=
?reg.Match(s);
????????????
int ?year? = ?? int .Parse(match.Groups[ " y "
].Value);
????????????
int ?month? = ? int .Parse(match.Groups[ " m "
].Value);
????????????
int ?day? = ? int ?.Parse(match.Groups[ " d "
].Value);
????????????DateTime?time?
= ? new
?DateTime(year,month,day);
????????????Console.WriteLine(time);
????????????Console.ReadLine();
????????}

以上的例子通過(guò)組來(lái)實(shí)現(xiàn)分析一個(gè)字符串,并把其轉(zhuǎn)化為一個(gè) DateTime 實(shí)例,當(dāng)然,這個(gè)功能用 DateTime.Parse 方法就能很方便的實(shí)現(xiàn)。

在這個(gè)例子中,我把一次 Match 結(jié)果用 (?<name>) 的方式分成三個(gè)組 "y","m","d" 分別代表年、月、日。

現(xiàn)在我們已經(jīng)有了組的概念了,再來(lái)看如何分組,很簡(jiǎn)單的,除了上在的辦法,我們可以用一對(duì)括號(hào)就定義出一個(gè)組,比如上例可以改成 ??

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " 2005-2-21 "
;
????????????Regex?reg?
= ? new ?Regex( @" (\d{4})-(\d{1,2})-(\d{1,2}) "
,RegexOptions.Compiled);
????????????Match?match?
=
?reg.Match(s);
????????????
int ?year? = ?? int .Parse(match.Groups[ 1
].Value);
????????????
int ?month? = ? int .Parse(match.Groups[ 2
].Value);
????????????
int ?day? = ? int ?.Parse(match.Groups[ 3
].Value);
????????????DateTime?time?
= ? new
?DateTime(year,month,day);
????????????Console.WriteLine(time);
????????????Console.ReadLine();
????????}


從上例可以看出,第一個(gè)括號(hào)對(duì)包涵的組被自動(dòng)編號(hào)為1,后面的括號(hào)依次編號(hào)為2、3…… ?

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " 2005-2-21 "
;
????????????Regex?reg?
= ? new ?Regex( @" (?<2>\d{4})-(?<1>\d{1,2})-(?<3>\d{1,2}) "
,RegexOptions.Compiled);
????????????Match?match?
=
?reg.Match(s);
????????????
int ?year? = ?? int .Parse(match.Groups[ 2
].Value);
????????????
int ?month? = ? int .Parse(match.Groups[ 1
].Value);
????????????
int ?day? = ? int ?.Parse(match.Groups[ 3
].Value);
????????????DateTime?time?
= ? new
?DateTime(year,month,day);
????????????Console.WriteLine(time);
????????????Console.ReadLine();
????????}

再看上例,我們用 (?< 數(shù)字 >) 的方式手工給每個(gè)括號(hào)對(duì)的組編號(hào),(注意我定義 1 2 的位置時(shí)不是從左到右定義的)

通過(guò)以上三例,我們知道了給 Regex 定義 Group 的三種辦法以及相應(yīng)的引用組匹配結(jié)果的方式。

然后,關(guān)于組定義,還有兩點(diǎn)請(qǐng)注意:
1 、因?yàn)槔ㄌ?hào)用于定義組了,所以如果要匹配 "(" ")" ,請(qǐng)使用 "\(" "\)"( 關(guān)于所有特殊字符的定義,請(qǐng)查看相關(guān) Regex expression 幫助文檔 )

2 、如果定義 Regex 時(shí),使用了 ExplicitCapture 選項(xiàng),則第二個(gè)例子不會(huì)成功,因?yàn)榇诉x項(xiàng)要求顯式定義了編號(hào)或名字的組才捕獲并保存結(jié)果,如果你沒(méi)有定義 ExplicitCapture 選項(xiàng),而有時(shí)又定義了類式于 (A|B) 這樣的部分在表達(dá)式,而這個(gè) (A|B) 你又并不想捕獲結(jié)果,那么可以使用“不捕獲的組”語(yǔ)法,即定義成 (?:) 的方式,針對(duì)于 (A|B), 你可以這樣來(lái)定義以達(dá)到不捕獲并保存它到 Group 集合中的目的-- (?:A|B) ?

上面內(nèi)容僅討論了一般的組,組還有很多的花樣,很多高級(jí)的功能,下一篇將試圖帶您體驗(yàn)一番其中洞天。

反向引用

反向引用,指把匹配出來(lái)的組引用到表達(dá)式本身其它地方,比如,在匹配 HTML 的標(biāo)記時(shí),我們匹配出一個(gè) <a>, 我們要把匹配出來(lái)的 a 引用出來(lái),用來(lái)找到 </a> ,這個(gè)時(shí)候就要用到反向引用。
語(yǔ)法
??? a 、反向引用編號(hào)的組,語(yǔ)法為
\number
??? b 、反向引用命名的組,語(yǔ)法為
\k<name>
舉例
??? a 、匹配成對(duì)的 HTML
標(biāo)簽

@" <(?<tag>[^\s>]+)[^>]*>.*</\k<tag>> " ????????

??? b 、匹配兩個(gè)兩個(gè)重疊出現(xiàn)的字符 ??

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " aabbc11asd "
;
????????????Regex?reg?
= ? new ?Regex( @" (\w)\1 "
);
????????????MatchCollection?matches?
=
?reg.Matches(s);
????????????
foreach (Match?m? in
?matches)
????????????????Console.WriteLine(m.Value);
????????????Console.ReadLine();
????????}
??????

返回結(jié)果為 aa bb 11 ?

輔助匹配組

以下幾種組結(jié)構(gòu),括號(hào)中的 Pattern 都不作為匹配結(jié)果的一部分進(jìn)行保存
??? 1 、正聲明
(?=)
???
涵義:括號(hào)中的模式必須出現(xiàn)在聲明右側(cè),但不作為匹配的一部分

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " C#.net,VB.net,PHP,Java,JScript.net "
;
????????????Regex?reg?
= ? new ?Regex( @" [\w\#]+(?=\.net) "
,RegexOptions.Compiled);
????????????MatchCollection?mc?
=
?reg.Matches(s);
????????????
foreach (Match?m? in
?mc)
????????????????Console.WriteLine(m.Value);?
????????????Console.ReadLine();
????????????
// 輸出?C#?VB?JScript

????????}

??? 可以看到匹配引擎要求匹配.net,但卻不把.net 放到匹配結(jié)果中
??? 2 、負(fù)聲明
(?!)
????
涵義:括號(hào)中的模式必須不出現(xiàn)在聲明右側(cè)
???????? 下例演示如何取得一個(gè) <a> 標(biāo)簽對(duì)中的全部?jī)?nèi)容,即使其中包含別的 HTML tag

???????? public ? static ? void ?Main()
????????
{?
????????????
string ?newsContent? = ? @" url:<a?href=""1.html""><img?src=""1.gif"">test<span?style=""color:red;"">Regex</span></a>. "
;
????????????Regex?regEnd?
= ? new ?Regex( @" <\s*a[^>]*>([^<]|<(?!/a))*<\s*/a\s*> "
,RegexOptions.Multiline);
????????????
????????????Console.WriteLine(regEnd.Match(newsContent).Value);
// Result:?<a?href="1.html"><img?src="1.gif">test<span?style="color:red;">Regex</span></a>

????????????Console.ReadLine();
????????}

??? 3、反向正聲明 (?<=)?
???
涵義:括號(hào)中的模式必須出現(xiàn)在聲明左側(cè),但不作為匹配的一部分
??? 4 、反向負(fù)聲明
(?<!)
???
涵義:括號(hào)中的模式必須不出現(xiàn)在聲明左側(cè)

非回溯匹配
語(yǔ)法:
(?>)
涵義:該組匹配后,其匹配的字符不能通過(guò)回溯用于后面的表達(dá)式的匹配。呵呵,光看這句話肯定搞不懂,我當(dāng)初為了搞懂這個(gè)也花了不少的時(shí)間,還是通過(guò)實(shí)例來(lái)說(shuō)明吧:
"www.csdn.net" 可以通過(guò) @"\w+\.(.*)\.\w+" 來(lái)匹配,卻不能通過(guò) @"\w+\.(?>.*)\.\w+" 來(lái)匹配!為什么呢?

原因是正則匹配是貪婪的,匹配時(shí)它會(huì)盡可能多的匹配最多的結(jié)果,所以,上例兩個(gè)正則式中的 .* 都會(huì)把 csdn.net 匹配完, 這個(gè)時(shí)候,第一個(gè)表達(dá)式在開始匹配時(shí)發(fā)現(xiàn) \.\w+ 沒(méi)得字符給它匹配了,所以它會(huì)進(jìn)行回溯,所謂回溯,就是把 .* 匹配的結(jié)果往回推,回推留出來(lái)的字符再用來(lái)匹配 \.\w+, 直到 \.\w+ 匹配成功,整個(gè)表達(dá)式返回成功的匹配結(jié)果。而第二個(gè)表達(dá)式,因使用的是非回溯匹配,所以, .* 匹配完后,不允許通過(guò)回溯來(lái)匹配 \.\w+ ,所以整個(gè)表達(dá)式匹配失敗。

請(qǐng)注意,回溯匹配是很浪費(fèi)資源的一種匹配方式,所以,請(qǐng)盡量避免您的正則式要通過(guò)回溯來(lái)成功匹配,如上例, 可以換成@"\w+\.([^\.]+\.)+\w+" +"

Lazy 匹配

語(yǔ)法: ??,*?,+?,{n}?,{n,m}?

涵義:簡(jiǎn)單說(shuō),后面的這個(gè) ?(lazy ) 告訴正則引擎,它前面的表達(dá)式匹配到最短的匹配項(xiàng)就不用匹配下去了,如 ?? ? 本身匹配 0-1 個(gè)匹配項(xiàng),那么 ?? 就取最短的,匹配 0 個(gè)項(xiàng)就不匹配下去了,同理, *? 匹配 0 個(gè), +? 匹配 1 個(gè), {n}? 匹配 n 個(gè), {n,m}? 匹配 n 個(gè)。當(dāng)用 @”\w*?” 匹配 ”abcd” 時(shí),會(huì)有 五次 成功匹配, 每次都匹配的結(jié)果都是空字符串 為什么會(huì)是 5 次呢 ,這是因?yàn)檎齽t引擎在匹配一個(gè)表達(dá)式時(shí)是一個(gè)字符一個(gè)字符對(duì)比下去的,每成功匹配一次,就前進(jìn)一下。

判斷表達(dá)式

語(yǔ)法:

??? 1 A|B ,這個(gè)是最基本的, A 或者 B ,其實(shí)這個(gè)不能算判斷
??? 2 (?(expression)yes-expression|no-expression), 其中 no-expression 為可選項(xiàng),意為,如果 expression 成立,則要求匹配 yes-expression, 否則要求匹配
no-expression
??? 3 (?(group-name)yes-expressioin|no-expression), 其中 no-expression 為可選項(xiàng),意為,如果名為 group-name 的組匹配成功,則要求匹配 yes-expression, 否則要求匹配
no-expression
??? ? 判斷表達(dá)式還是很好理解的,唯有一點(diǎn)要注意: @"(?(A)A|B)" 不能匹配 "AA", 為什么呢 ? 要怎么樣寫才能匹配呢,大家先想想……

我們應(yīng)該這樣寫 Regex: @”(?(A)AA|B)” ,請(qǐng)注意,判斷式中的內(nèi)容并不會(huì)做為 yes-expression no-expression 表達(dá)式的一部分。 ?

.net 的正則引擎工作特點(diǎn)

??? .net 的正則引擎工作方式大多數(shù)和我們“想當(dāng)然”的方式一樣,只是有幾點(diǎn)要注意:
??? 1 .NET Framework 正則表達(dá)式引擎盡可能的匹配多的字符(貪婪)。正是由于這一點(diǎn),所以,不要用 @"<.*>(.*)</.*>" 這樣的正則式來(lái)試圖找出一個(gè) HTML 文檔中的所有 innerText 。(我也正是在網(wǎng)上看到有人這樣寫正則式才決定要寫《正則表達(dá)式
高級(jí)技巧》的,呵呵)
2 .NET Framework 正則表達(dá)式引擎是回溯的正則表達(dá)式匹配器,它并入了傳統(tǒng)的非確定性有限自動(dòng)機(jī) (NFA) 引擎(例如 Perl Python 使用的引擎)。這使其有別于更快的、但功能更有限的純正則表達(dá)式確定性有限自動(dòng)機(jī) (DFA) 引擎。 .NET Framework 正則表達(dá)式引擎盡量匹配成功,所以,當(dāng) @"\w+\.(.*)\.\w+" 中的 .* www. .csdn.net 中的 .csdn.net 都匹配完了,讓后面的 \.\w+
沒(méi)得字符去匹配時(shí),引擎會(huì)進(jìn)行回溯,以得到成功的匹配。
NET Framework 正則表達(dá)式引擎還包括了一組完整的語(yǔ)法,讓程序員能夠操縱回溯引擎。包括:

“惰性”限定符: ?? *? +? {n,m}?
。這些惰性限定符指示回溯引擎首先搜索最少數(shù)目的重復(fù)。與之相反,普通的“貪婪的”限定符首先嘗試匹配最大數(shù)目的重復(fù)。
從右到左匹配。這在從右到左而非從左到右搜索的情況下十分有用,或者在從模式的右側(cè)部分開始搜索比從模式的左側(cè)部分開始搜索更為有效的情況下十分有用。
3 .NET Framework 正則表達(dá)式引擎在 (expression1|expression2|expression3) 這樣情況下, expression1 總是最先得到嘗試,再依次是 expression2 expression3
???????????

???????? public ? static ? void ?Main()
????????
{????
????????????
string ?s? = ? " THIN?is?a?asp.net?developer. "
;
????????????Regex?reg?
= ? new ?Regex( @" (\w{2}|\w{3}|\w{4}) " ,RegexOptions.Compiled |
RegexOptions.IgnoreCase);
????????????MatchCollection?mc?
=
?reg.Matches(s);
????????????
foreach (Match?m? in
?mc)
????????????????Console.WriteLine(m.Value);?
????????????Console.ReadLine();
????}

輸出結(jié)果是 : TH’ ‘IN’ ‘is’ ‘a(chǎn)s’ ‘ne’ ‘de’ ‘ve’ ‘lo’ ‘pe’

附表

轉(zhuǎn)義符

說(shuō)明

一般字符

.$ ^ { [ ( | ) * + ? \ 外,其他字符與自身匹配。

\a

與響鈴(警報(bào)) \u0007 匹配。

\b

在正則表達(dá)式中, \b 表示單詞邊界(在 \w \W 之間),不過(guò),在 [] 字符類中, \b 表示退格符。在替換模式中, \b 始終表示退格符。

\t

Tab \u0009 匹配。

\r

與回車符 \u000D 匹配。

\v

與垂直 Tab \u000B 匹配。

\f

與換頁(yè)符 \u000C 匹配。

\n

與換行符 \u000A 匹配。

\e

Esc \u001B 匹配。

\040

ASCII 字符匹配為八進(jìn)制數(shù)(最多三位);如果沒(méi)有前導(dǎo)零的數(shù)字只有一位數(shù)或者與捕獲組號(hào)相對(duì)應(yīng),則該數(shù)字為后向引用。例如,字符 ? \040 表示空格。

\x20

使用十六進(jìn)制表示形式(恰好兩位)與 ASCII 字符匹配。

\cC

ASCII 控制字符匹配;例如, \cC Ctrl-C

\u0020

使用十六進(jìn)制表示形式(恰好四位)與 Unicode 字符匹配。

\

在后面帶有不識(shí)別為轉(zhuǎn)義符的字符時(shí),與該字符匹配。例如, \* \x2A 相同。

字符類

說(shuō)明

.

匹配除 \n 以外的任何字符。如果已用 Singleline 選項(xiàng)做過(guò)修改,則句點(diǎn)字符可與任何字符匹配。

[ aeiou ]

與指定字符集中包含的任何單個(gè)字符匹配。

[^ aeiou ]

與不在指定字符集中的任何單個(gè)字符匹配。

[0-9a-fA-F]

使用連字號(hào) (–) 允許指定連續(xù)字符范圍。

\p{ name }

{name} 指定的命名字符類中的任何字符都匹配。支持的名稱為 Unicode 組和塊范圍。例如, Ll Nd Z IsGreek IsBoxDrawing 。可以使用 GetUnicodeCategory 方法找到某個(gè)字符所屬的 Unicode 類別。

\P{ name }

與在 {name} 中指定的組和塊范圍不包括的文本匹配。

\w

與任何單詞字符匹配。等效于 Unicode 字符類別 [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] 。如果用 ECMAScript 選項(xiàng)指定了符合 ECMAScript 的行為,則 \w 等效于 [a-zA-Z_0-9]

\W

與任何非單詞字符匹配。等效于 Unicode 字符類別 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] 。如果用 ECMAScript 選項(xiàng)指定了符合 ECMAScript 的行為,則 \W 等效于 [^a-zA-Z_0-9]

\s

與任何空白字符匹配。等效于 Unicode 字符類別 [\f\n\r\t\v\x85\p{Z}] 。如果用 ECMAScript 選項(xiàng)指定了符合 ECMAScript 的行為,則 \s 等效于 [ \f\n\r\t\v]

\S

與任何非空白字符匹配。等效于 Unicode 字符類別 [^\f\n\r\t\v\x85\p{Z}] 。如果用 ECMAScript 選項(xiàng)指定了符合 ECMAScript 的行為,則 \S 等效于 [^ \f\n\r\t\v]

\d

與任何十進(jìn)制數(shù)字匹配。對(duì)于 Unicode 類別的 ECMAScript 行為,等效于 \p{Nd} ,對(duì)于非 Unicode 類別的 ECMAScript 行為,等效于 [0-9]

\D

與任何非數(shù)字匹配。對(duì)于 Unicode 類別的 ECMAScript 行為,等效于 \P{Nd} ,對(duì)于非 Unicode 類別的 ECMAScript 行為,等效于 [^0-9]

斷言

說(shuō)明

^

指定匹配必須出現(xiàn)在字符串的開頭或行的開頭。。

$

指定匹配必須出現(xiàn)在以下位置:字符串結(jié)尾、字符串結(jié)尾處的 \n 之前或行的結(jié)尾。

\A

指定匹配必須出現(xiàn)在字符串的開頭(忽略 Multiline 選項(xiàng))。

\Z

指定匹配必須出現(xiàn)在字符串的結(jié)尾或字符串結(jié)尾處的 \n 之前(忽略 Multiline 選項(xiàng))。

\z

指定匹配必須出現(xiàn)在字符串的結(jié)尾(忽略 Multiline 選項(xiàng))。

\G

指定匹配必須出現(xiàn)在上一個(gè)匹配結(jié)束的地方。與 Match.NextMatch() 一起使用時(shí),此斷言確保所有匹配都是連續(xù)的。

\b

指定匹配必須出現(xiàn)在 \w (字母數(shù)字)和 \W (非字母數(shù)字)字符之間的邊界上。匹配必須出現(xiàn)在單詞邊界上,即出現(xiàn)在由任何非字母數(shù)字字符分隔的單詞中第一個(gè)或最后一個(gè)字符上。

\B

指定匹配不得出現(xiàn)在 \b 邊界上。

限定符

說(shuō)明

*

指定零個(gè)或更多個(gè)匹配;例如 \w* (abc)* 。等效于 {0,}

+

指定一個(gè)或多個(gè)匹配;例如 \w+ (abc)+ 。等效于 {1,}

?

指定零個(gè)或一個(gè)匹配;例如 \w? (abc)? 。等效于 {0,1}

{ n }

指定恰好 n 個(gè)匹配;例如 (pizza){2}

{ n ,}

指定至少 n 個(gè)匹配;例如 (abc){2,}

{ n , m }

指定至少 n 個(gè)但不多于 m 個(gè)匹配。

*?

指定盡可能少地使用重復(fù)的第一個(gè)匹配(等效于 lazy * )。

+?

指定盡可能少地使用重復(fù)但至少使用一次(等效于 lazy + )。

??

指定使用零次重復(fù)(如有可能)或一次重復(fù) (lazy ?)

{ n }?

等效于 {n} (lazy {n})

{ n ,}?

指定盡可能少地使用重復(fù)但至少使用 n (lazy {n,})

{ n , m }?

指定介于 n 次和 m 次之間、盡可能少地使用重復(fù) (lazy {n,m})

?--完--

?

posted on 2008-04-02 13:42 snowball 閱讀(526) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 文章轉(zhuǎn)載學(xué)習(xí)

導(dǎo)航

留言簿(1)

隨筆分類

友情鏈接

搜索

  •  

最新隨筆

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲人午夜精品| 亚洲乱码精品一二三四区日韩在线| 夜夜爽www精品| 亚洲精品国产精品国自产观看浪潮| 久久亚洲精品一区| 亚洲第一黄色网| 91久久精品美女高潮| 欧美黄色成人网| 亚洲精品一区二区三区不| 亚洲激情在线播放| 一区二区三区波多野结衣在线观看| 亚洲看片网站| 亚洲自拍偷拍网址| 久久激五月天综合精品| 老司机67194精品线观看| 欧美高清在线观看| 欧美日韩国内| 国产有码一区二区| 在线播放中文字幕一区| 亚洲精品国产无天堂网2021| a4yy欧美一区二区三区| 欧美在线黄色| 亚洲国产精品999| 中文一区在线| 老司机67194精品线观看| 欧美系列精品| 亚洲国产日韩一区二区| 性色av一区二区三区| 久久综合狠狠| 亚洲一级特黄| 嫩草影视亚洲| 国产伦一区二区三区色一情| 国产一区二区三区久久久| 亚洲福利精品| 日韩视频在线一区二区三区| 亚洲美女中出| 欧美黄色影院| 久久青青草原一区二区| 欧美黑人在线播放| 亚洲国产日韩欧美在线图片 | 韩国亚洲精品| 欧美在线观看视频一区二区三区| 欧美大片免费久久精品三p | 欧美成人免费播放| 久久国产精品99国产| 国产精品成人一区二区网站软件| 亚洲精品国产精品乱码不99| 欧美刺激性大交免费视频| 久久国产加勒比精品无码| 韩国精品主播一区二区在线观看| 欧美伊人久久大香线蕉综合69| 国产精品99久久久久久久vr| 欧美网站在线| 久久免费视频在线| 欧美极品aⅴ影院| 午夜视频一区二区| 久久精品盗摄| 99精品视频一区二区三区| 亚洲精品综合久久中文字幕| 香港成人在线视频| 在线精品亚洲一区二区| 狠狠色丁香婷综合久久| 欧美成人国产一区二区| 欧美日韩亚洲另类| 欧美一区二区视频在线| 久久久久成人精品| 中文精品视频| 美国十次成人| 久久综合色播五月| 国产精品免费看| 久久精品国产精品亚洲综合| 欧美激情一区二区三区四区| 欧美一区日本一区韩国一区| 欧美精品粉嫩高潮一区二区 | 欧美日韩国产区一| 蜜桃av综合| 国产亚洲欧洲997久久综合| 香港久久久电影| 国产精品videosex极品| 亚洲啪啪91| 日韩视频中午一区| 欧美极品一区二区三区| 美女黄网久久| 亚洲电影一级黄| 欧美暴力喷水在线| 欧美激情在线| 亚洲视频碰碰| 国产精品尤物| 久久精品免费电影| 亚洲国产精品成人| 一区二区欧美在线观看| 欧美日韩理论| 亚洲欧美日韩精品一区二区| 久久国产高清| 亚洲精品在线二区| 国产精品视频免费一区| 久久av在线看| 韩日欧美一区二区| 久久天天躁夜夜躁狠狠躁2022| 美女福利精品视频| 一区二区三区四区五区在线| 国产精品久久久久免费a∨大胸 | 99这里只有久久精品视频| 欧美精品一区二| 欧美一区二区私人影院日本 | 国产在线视频欧美| 亚洲欧美经典视频| 在线观看不卡| 国产精品久久97| 欧美激情一区二区三区蜜桃视频| 日韩视频永久免费观看| 蜜臀久久久99精品久久久久久| 亚洲区一区二区三区| 国产欧美精品久久| 欧美日韩国产精品一卡| 美女脱光内衣内裤视频久久影院 | 欧美资源在线观看| 亚洲午夜视频| 午夜一区在线| 久久久精品999| 久久先锋资源| 亚洲二区在线视频| 日韩系列欧美系列| 亚洲伊人第一页| 久久久91精品国产一区二区三区 | 欧美电影资源| 亚洲精品在线三区| 亚洲精品之草原avav久久| 国产日韩欧美在线看| 欧美午夜视频一区二区| 欧美韩日高清| 欧美精品一区在线| 每日更新成人在线视频| 久久久久se| 免费在线一区二区| 欧美精品午夜| 欧美区一区二| 老司机成人在线视频| 免费日韩精品中文字幕视频在线| 久久影院午夜论| 欧美电影在线观看| 欧美成人免费全部| 亚洲精品国久久99热| 亚洲美女性视频| 午夜在线不卡| 欧美成人国产| 午夜日韩激情| 欧美精品二区| 在线视频欧美日韩| 久久狠狠久久综合桃花| 欧美成人自拍视频| 国产欧美日韩视频| 亚洲精品国产精品乱码不99按摩| 亚洲免费视频一区二区| 牛夜精品久久久久久久99黑人| 最新成人在线| 久久亚洲综合网| 国产亚洲一区在线| 亚洲先锋成人| 亚洲精品日韩一| 蜜乳av另类精品一区二区| 国产精品手机在线| 在线亚洲高清视频| 亚洲级视频在线观看免费1级| 中文亚洲字幕| 亚洲精品综合| 国产精品乱码一区二区三区| 激情一区二区三区| 久久天堂精品| 久久一区视频| 亚洲一区在线视频| 亚洲视频精品| 国产综合在线看| 美女尤物久久精品| 欧美日韩视频| 欧美黄在线观看| 在线日韩一区二区| 亚洲免费在线观看| 国产日韩欧美日韩| 久久免费高清视频| 欧美va亚洲va国产综合| 国产又爽又黄的激情精品视频| 久久国内精品视频| 欧美国产日韩二区| 在线午夜精品| 久久国产66| 亚洲一区二区在线免费观看视频| 一本久久青青| 国语自产精品视频在线看一大j8| 久久久无码精品亚洲日韩按摩| 久久亚洲综合色| 亚洲一区中文| 欧美片第1页综合| 久久久久99| 国产精品一区二区三区久久久| 亚欧成人精品| 欧美午夜在线视频| 亚洲国产精品欧美一二99| 国产亚洲在线| 性欧美大战久久久久久久免费观看|