自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解Visual Studio正則替換大法

開(kāi)發(fā) 后端
在工作中,尤其是重構(gòu)的時(shí)候,對(duì)原有大批量的代碼進(jìn)行修改是一件很累人的工作,稍有不甚,可能就會(huì)有遺漏。本文今天就與大家一起探索Visual Studio中非常實(shí)用但卻鮮為人知的功能,Regex Replace(正則替換)。

某天,我遇到一堆這樣的代碼:

Visual Studio正則替換代碼片段

大家都看出來(lái)了,發(fā)現(xiàn)兩個(gè)問(wèn)題:

1.       檢查是否為空的部分不是太合理;

2.       DataReader使用索引的方式很難維護(hù),要是查詢(xún)?cè)黾幼侄危蔷椭荒茉诤竺嬖黾恿恕?BR>

團(tuán)隊(duì)中有人重寫(xiě)了DataReader的方法,改進(jìn)了這兩點(diǎn),就是使用rdr.GetInt32(“ID”)這種使用字段名的訪問(wèn)方式訪問(wèn)數(shù)據(jù),另外還有一個(gè)重載,rdr.GetInt32(“ImageNumber”,0)這種為Null情況下賦默認(rèn)值的操作,現(xiàn)在我們就要開(kāi)始對(duì)代碼就行重構(gòu)。

發(fā)現(xiàn)一個(gè)問(wèn)題,直接用Find & Replace肯定不行,因?yàn)槔锩婕从邢嗤c(diǎn),又有不同點(diǎn),最主要的不同就是每一行的Index參數(shù)都不同。

于是開(kāi)始在ReplaceFind Options里面找線索,發(fā)現(xiàn)最下方有一個(gè)Use,選中后可以選Regular ExpressionsWildcards。Wildcards其實(shí)是類(lèi)似于系統(tǒng)的文件搜索方式,用“*”匹配任意文本,由于不在本文今天的討論范圍之內(nèi),就不贅述了。

Visual Studio正則替換代碼片段

         
正則表達(dá)式相信大家都很熟悉了,但這里的正則和以往大家所熟悉的正則有點(diǎn)不同,語(yǔ)法上有點(diǎn)不同,他是專(zhuān)門(mén)用于Visual Studio的,詳細(xì)情往下看。

我們先開(kāi)始搜索吧,先采集一段樣本,直接復(fù)制ID = rdr.GetValue(0) == DBNull.Value ? 0 : rdr.GetInt32(0)Find What輸入框中,點(diǎn)擊Find Next,發(fā)現(xiàn)提示“:”未知。

大家都想到了,正則中,很多符號(hào)都有自己定義的意思的,而我們這里不用他在正則中的意思,而是要搜索這個(gè)符號(hào),所以我們要在有些符號(hào)前加上轉(zhuǎn)義符“\”,變成ID = rdr\.GetValue\(0\) == DBNull.Value ? 0 \: rdr\.GetInt32\(0\)”,話說(shuō)有人就要問(wèn)了,“=”“?”怎么就不用呢?難道沒(méi)有意思么?我的回答是:請(qǐng)參考http://msdn.microsoft.com/en-us/library/2k3te2cs.aspx 。 

其實(shí)也不用那么麻煩,直接點(diǎn)輸入框右邊的三角,就可以得到常用的符號(hào)列表:

現(xiàn)在點(diǎn)擊FindNext,發(fā)現(xiàn)已經(jīng)能找到第一條符合的了,現(xiàn)在我們要抽取公共的部分,改寫(xiě)變化的部分,我們發(fā)現(xiàn)其實(shí)就是第一個(gè)部分的屬性名和兩個(gè)Index參數(shù)以及一個(gè)默認(rèn)值三部分是變化的,我們將FindWhat改寫(xiě)為:“:i=rdr\.GetValue\(:z\)==DBNull.Value?:z\:rdr\.GetInt32\(:z\)”,其中,:i表示Identifier,:z表示Integer。

現(xiàn)在我們?cè)冱c(diǎn)擊FindNext發(fā)現(xiàn)找到了,再點(diǎn)一下,發(fā)現(xiàn)問(wèn)題了,還是這句,只是開(kāi)頭的變量名被高亮的部分少了一個(gè)字符,發(fā)現(xiàn)問(wèn)題就要解決啊!我們?yōu)?i加上單詞邊界符”<“和”>”,整句就變成”<:i>=rdr\.GetValue\(:z\)==DBNull.Value?:z\:rdr\.GetInt32\(:z\)”,再點(diǎn)FindNext。發(fā)現(xiàn)終于成功了。

以上是查找部分,你會(huì)了么?接下來(lái)就要進(jìn)行我們激動(dòng)人心的替換了!
我總結(jié)了一句話:用"{}"包圍起不變的變化,用"\index"恢復(fù)她

解釋一下,什么叫不變的變化呢?就如以上所示的“<:i>”,他是一個(gè)變量,每一行的都不同,所以他是變化的,而替換后的結(jié)果要求這些變化要保留,就是變量名替換后還是原來(lái)的。
比如:ID=xxxx;
Name=xxxx;
替換后要為:ID=yyyy;
Name=yyyy;

好!現(xiàn)在開(kāi)始實(shí)施這句話,將”<:i>”變?yōu)椤?lt;{:i}>“。因?yàn)樗饕凳且獟仐壍?,而默認(rèn)值是要保留的,所以整句話就變成<{:i}>=rdr\.GetValue\(:z\)==DBNull.Value?{:z}\:rdr\.GetInt32\(:z\)。
在ReplaceWith當(dāng)中,我們寫(xiě)上要替換成的語(yǔ)句!注意:在ReplaceWith中,因?yàn)椴恍枰M(jìn)行正則查找,所以符號(hào)可以直接輸,不用“\”轉(zhuǎn)義,但”\”別有他用,用”\index”表示搜索式中被標(biāo)記的第index個(gè)內(nèi)容,index從1開(kāi)始,"\0“表示搜索到的原內(nèi)容。所以我們的ReplaceWith填\1=rdr.GetInt32("\1",\2)開(kāi)始替換。

替換前:

Visual Studio正則替換代碼片段替換前


替換后:

Visual Studio正則替換代碼片段替換后

 大家可能發(fā)現(xiàn)了,只替換了一部分GetInt32的,還有一堆GetString的,這里就留給大家去研究了!

我總結(jié)一下今天我們搜索條件的變化,給大家一個(gè)明顯的思路提示。

1.取樣:ID=rdr.GetValue(0)==DBNull.Value?0:rdr.GetInt32(0)

2.轉(zhuǎn)義:ID=rdr\.GetValue\(0\)==DBNull.Value?0\:rdr\.GetInt32\(0\)

3.抽象::i=rdr\.GetValue\(:z\)==DBNull.Value?:z\:rdr\.GetInt32\(:z\)

4.縮范:<:i>=rdr\.GetValue\(:z\)==DBNull.Value?:z\:rdr\.GetInt32\(:z\)

5.標(biāo)記:<{:i}>=rdr\.GetValue\(:z\)==DBNull.Value?{:z}\:rdr\.GetInt32\(:z\)

6.替換:\1=rdr.GetInt32("\1",\2)

怎么樣?這個(gè)正則不太繁吧!
 

【編輯推薦】

  1. Visual Studio 2010應(yīng)用與開(kāi)發(fā)詳解
  2. C# 4.0新特性dynamic作用淺析
  3. C# 2010協(xié)變和逆變的新特性
  4. Visual Studio 2010 Beta1試用手記
  5. Visual Studio 2010重要新功能一覽
責(zé)任編輯:彭凡 來(lái)源: cnblogs
相關(guān)推薦

2009-12-16 15:44:20

Visual Stud

2011-03-28 09:23:31

Visual Stud

2010-03-11 14:37:47

Visual StudScrum

2010-07-27 09:40:01

敏捷Visual Stud

2010-07-29 09:41:23

Visual Stud

2010-02-05 09:06:17

Visual Stud

2010-08-23 09:14:18

Visual Stud

2010-03-19 16:43:37

Visual Stud

2010-01-27 10:32:40

Visual Stud

2009-11-24 09:00:02

Visual Stud

2009-12-15 09:36:32

Visual Stud

2011-06-29 09:42:12

Visual Stud Qt Opensource

2010-04-01 14:51:52

Visual Stud

2009-09-24 10:10:07

Visual Stud

2009-11-18 09:14:49

Visual Stud

2010-01-14 14:12:14

Visual Stud

2010-02-23 09:02:00

Visual Stud

2010-01-22 09:51:31

Visual Stud

2023-10-12 08:41:36

C# 開(kāi)發(fā)工具

2010-12-16 10:00:20

QtVisual Stud
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)