.NETCoreCSharp 中級篇2-4
本節(jié)內(nèi)容為正則表達(dá)式的使用
簡介
有的時候,你是否有過這種需求:判斷一個Ip地址、郵箱、密碼規(guī)則是否合法。如果讓你使用if一類的傳統(tǒng)方法進(jìn)行處理,你肯定會被逼瘋的。而對于絕大多數(shù)的編程語言而言,都有一個字符串處理利器————正則表達(dá)式。它可以輕松的讓字符串和規(guī)則匹配上。有點這樣的意思,從前你是判斷字符串,去遍歷它,而有了正則表達(dá)式,你是在書寫一個通用性質(zhì)的規(guī)則,讓字符串與規(guī)則進(jìn)行匹配。正則表達(dá)式本質(zhì)上就是一串蘊含了一些特殊字符規(guī)則的字符串,因此我們書寫正則表達(dá)式其實是在書寫一個字符串,只是它代表了一定的規(guī)則而已。
常見的幾種正則符號
事實上正則表達(dá)式?jīng)]有過多的知識點,只是一些技巧性的訓(xùn)練,但請相信我,正則表達(dá)式是非常重要的。熟練的使用下列的正則符號會對你大有脾益。
元字符
元字符 說明
. 匹配除了換行符以外的任意字符
\w 匹配字母、數(shù)字、下劃線以及漢字
\s 匹配任意空白符
\d 匹配數(shù)字
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
1.例如匹配abc開頭的字符串
\babc 或者 ^abc
2.匹配5位數(shù)字的字符串
^\d\d\d\d\d$
重復(fù)限定符號
有了元字符就可以寫不少的正則表達(dá)式了,但細(xì)心的你們可能會發(fā)現(xiàn):別人寫的正則簡潔明了,如果你只使用元字符進(jìn)行正則表達(dá)式的書寫,既不美觀也不實用,因此我們使用重復(fù)限定符進(jìn)行重復(fù)數(shù)據(jù)的處理,下面我們來看一些限定符:
字符 說明
* 重復(fù)0次或多次
+ 重復(fù)一次或一次以上
? 重復(fù)0次或一次
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次
現(xiàn)在我們就能書寫相當(dāng)美觀的正則表達(dá)式了,例如:
1.匹配7位數(shù)字的電話號碼
^\d{7}$
2.匹配138開頭的手機(jī)號
^138\d{8}
3.匹配a開頭,若干個b結(jié)尾的字符串
^ab*$
分組
現(xiàn)在我們已經(jīng)學(xué)會以一點關(guān)于書寫正則表達(dá)式的方法,不過,我們現(xiàn)在無論是匹配還是重復(fù)都是針對單個字符進(jìn)行操作,假如說我希望匹配一個以ab為循環(huán)的重復(fù)字符串應(yīng)該如何去處理呢?
答案很簡單,就是分組,分組我們通常使用()進(jìn)行分組,例如匹配以ab為循環(huán)的字符串為:
^(ab)*
轉(zhuǎn)義字符
有的時候,我們需要匹配的字符串中本身就含有正則表達(dá)式中的關(guān)鍵字符,我們則需要轉(zhuǎn)義,例如我們需要匹配(ab)為循環(huán)的字符串:
^(\(ab\))*
反斜杠\就是我們的轉(zhuǎn)義字符。不過對于C#中,字符串含有反斜杠會自動轉(zhuǎn)義,為了避免這種情況,我們需要在字符串之前加上@或者將將轉(zhuǎn)義字符轉(zhuǎn)義,也就是\兩個斜杠
條件或
有的時候,我們需要匹配的字符串可能是ab開頭也有可能是cd開頭,這個時候我們就使用條件語句處理,例如:
^(ab|cd)*
用邏輯或“|”進(jìn)行處理。
區(qū)間匹配
有的時候,我們有可能是需要匹配比如說138-150之間所有數(shù)字開頭的字符串,或者說A-F按字母表順序內(nèi)的字母開頭,我們可以這樣
^[138-150]* ^[A-F]*
反義
之前我們談?wù)摰亩际亲址泻惺裁词裁?,現(xiàn)在我們可能需要匹配到字符串中不含有的字符,那么我們就需要使用反義,如下表
元字符 說明
\W 匹配不是字母、數(shù)字、下劃線以及漢字
\S 匹配不是空白符
\D 匹配不是數(shù)字
\B 匹配不是單詞的開始或結(jié)束
[^x] 匹配出了x以外的任意字符
貪婪模式與懶惰模式
貪婪
貪婪是當(dāng)正則表達(dá)式中包含能接受重復(fù)的限定符時,通常的行為是(在使整個表達(dá)式能得到匹配的前提下)匹配盡可能多的字符,這匹配方式叫做貪婪匹配。特性:一次性讀入整個字符串進(jìn)行匹配,每當(dāng)不匹配就舍棄最右邊一個字符,繼續(xù)匹配,依次匹配和舍棄(這種匹配-舍棄的方式也叫做回溯),直到匹配成功或者把整個字符串舍棄完為止,因此它是一種最大化的數(shù)據(jù)返回,能多不會少。
事實上我們之前所談?wù)摰闹貜?fù)限定符就是一種貪婪量詞
舉個例子例如我們需要匹配由2-5個數(shù)字組成的字符串,假設(shè)有這樣一串?dāng)?shù)字51354 8454 1 568,使用^\d{2,5}進(jìn)行匹配的結(jié)果是51354
8454 568,事實上對于這些而言,匹配兩個就已經(jīng)滿足了,例如51已經(jīng)滿足該正則式,但是在貪婪匹配中,它會盡可能的多匹配,將整個字符串輸出。
如果多個貪婪量詞疊加在一起,如果字符串能滿足他們各自最大程度的匹配時,就互不干擾,但如果不能滿足時,會根據(jù)深度優(yōu)先原則,也就是從左到右的每一個貪婪量詞,優(yōu)先最大數(shù)量的滿足,剩余再分配下一個量詞匹配。
懶惰
懶惰匹配:當(dāng)正則表達(dá)式中包含能接受重復(fù)的限定符時,通常的行為是(在使整個表達(dá)式能得到匹配的前提下)匹配盡可能少的字符,這匹配方式叫做懶惰匹配。特性:從左到右,從字符串的最左邊開始匹配,每次試圖不讀入字符匹配,匹配成功,則完成匹配,否則讀入一個字符再匹配,依此循環(huán)(讀入字符、匹配)直到匹配成功或者把字符串的字符匹配完為止。
使用懶惰量詞就是在貪婪量詞后面中加?,對于之前的例子,他會匹配成51 35 84 54 56
拓展
零寬斷言
零寬斷言用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:
斷言用來聲明一個應(yīng)該為真的事實。正則表達(dá)式中只有當(dāng)斷言為真時才會繼續(xù)進(jìn)行匹配。
非常抽象而且籠統(tǒng),對吧,事實上我也那么覺得,以上內(nèi)容來自百度百科,因為我實在是很難解釋這個東西,你可以理解為匹配不含正則結(jié)果的內(nèi)容吧。
正向先行斷言(正前瞻)
正前瞻的語法為:
//pattern為正則式 (?=pattern)
它用于匹配pattern表達(dá)式之前的內(nèi)容,并不返回本身。感覺還是很奇怪對吧,舉一個例子:今年我市GDP為5600億元。假設(shè)你要將這句話中的5600取出來,你使用正前瞻的方式應(yīng)該怎么做?
\d+(?=億元)
正向后行斷言(正后顧):
正后顧的語法為:
//pattern為正則式 (?<=pattern)
與正前瞻相反,他是返回pattern之后的內(nèi)容,如果繼續(xù)實現(xiàn)之前的內(nèi)容,那么表達(dá)式就會變成
(<=今年我市GDP為)\d+
負(fù)向先行斷言(負(fù)前瞻)
負(fù)前瞻的語法為:
//pattern為正則式 (?!pattern)
匹配非pattern表達(dá)式的前面內(nèi)容,不返回本身。還是舉之前的例子,我要找到5600億元之前的字母,那么可以是
[A-Z]+(?!5600億元)
負(fù)向后行斷言(負(fù)后顧)
這個想必我不需要進(jìn)行講解各位也應(yīng)當(dāng)能思考出如何書寫及使用了,他的語法類似的是:
//pattern為正則式 (?<!pattern)
作用當(dāng)然是匹配非pattern之后的內(nèi)容。
我在這里就舉這幾個例子,還有一些很好的使用手冊你可以參考Microsoft Documents
<https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/regular-expressions>
。
捕獲與非捕獲
捕獲你可以理解為將表達(dá)式按組分配,例如你匹配一個電話010-8511561,010是區(qū)號,我們有可能利用正則式將它單獨取出來。
數(shù)字編號捕獲組
語法就是我們之前的分組,但是匹配這個電話號碼的時候,他的表達(dá)式如果是
((\d{3})-(\d{7}))
那么他會分為三組,第一組是完整的電話,第二組是我們的區(qū)號,第三組是我們的電話號碼。
命名編號捕獲組
語法:
(?<name>exp)
這個name就是你自己自定義的,例如之前的我們可以寫成
(?<quhao>\d{3})-(?<haoma>\d{7})
這樣我們可以通過名稱進(jìn)行訪問組內(nèi)數(shù)據(jù),具體的使用我會在后面進(jìn)行講解。
非捕獲組
同之前相反,它用于表示不需要分組的數(shù)據(jù)
(?:exp)
例如我們不需要區(qū)號,那么正則式就變成了
(?:\d{3})-(\d{7})
反向引用
捕獲會返回一個捕獲組,這個分組是保存在內(nèi)存中,不僅可以在正則表達(dá)式外部通過程序進(jìn)行引用,也可以在正則表達(dá)式內(nèi)部進(jìn)行引用,這種引用方式就是反向引用。
同樣的,根據(jù)捕獲組命名規(guī)則,反向引用也有兩種
1- 數(shù)字反向引用:\k或\number
2- 命名反向引用:\k或'name'
反向引用通常和捕獲組是一同使用的,它的作用主要是用來查找一些重復(fù)的內(nèi)容或者做替換指定字符。比如要查找一串字母"aabbbbgbddesddfiid"里成對的字母。
我們捋捋思路:
* 首先我們要有一個匹配字母的捕獲組:(\w)
* 然后(\w)\1
這樣就可以了,\1代表的是1分組,這樣就是一個匹配成對字母的正則式了。
如何使用正則表達(dá)式
位于 System.Text.RegularExpressions 空間下的 Regex 可以對正則表達(dá)式進(jìn)行處理。
Match
這是匹配結(jié)果的對象,內(nèi)含這幾個常用的屬性及方法
* Value:匹配值
* Groups:分組
* Index:匹配值的第一個字符的索引
* Success:是否符合正則式
*
NextMatch:下一個符合的匹配值
Regex.Matches
匹配多個符合的結(jié)果,返回一個MatchCollection數(shù)組,使用foreach并轉(zhuǎn)換成Match對象進(jìn)行訪問.
* IsMatch:是否符合正則式
* Replace:替換匹配上正則式的字符串
* Split:按匹配上的字符串進(jìn)行分割
* Match:返回第一個符合正則式的字符串
*
Matches:返回所有符合的字符串
Reference
老劉 <https://www.zhihu.com/question/48219401/answer/742444326>
如果我的文章幫助了您,請您在github.NETCoreGuide項目幫我點一個star,在博客園中點一個關(guān)注和推薦。
Github <https://github.com/StevenEco/.NetCoreGuide>
BiliBili主頁 <https://space.bilibili.com/33311288>
WarrenRyan'sBlog <https://blog.tity.xyz>
博客園 <https://cnblogs.com/warrenryan>
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看