日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解VisualStudio正則替換大法

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

創(chuàng)新互聯(lián)是一家專業(yè)提供安溪企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、成都做網(wǎng)站、HTML5、小程序制作等業(yè)務。10年已為安溪眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司優(yōu)惠進行中。

大家都看出來了,發(fā)現(xiàn)兩個問題:

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

2.       DataReader使用索引的方式很難維護,要是查詢增加字段,那就只能在后面增加了。

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

發(fā)現(xiàn)一個問題,直接用Find & Replace肯定不行,因為里面即有相同點,又有不同點,最主要的不同就是每一行的Index參數(shù)都不同。

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

         
正則表達式相信大家都很熟悉了,但這里的正則和以往大家所熟悉的正則有點不同,語法上有點不同,他是專門用于Visual Studio的,詳細情往下看。

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

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

其實也不用那么麻煩,直接點輸入框右邊的三角,就可以得到常用的符號列表:

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

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

以上是查找部分,你會了么?接下來就要進行我們激動人心的替換了!
我總結了一句話:用"{}"包圍起不變的變化,用"\index"恢復她

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

好!現(xiàn)在開始實施這句話,將”<:i>”變?yōu)椤?{:i}>“。因為索引值是要拋棄的,而默認值是要保留的,所以整句話就變成<{:i}>=rdr\.GetValue\(:z\)==DBNull.Value?{:z}\:rdr\.GetInt32\(:z\)。
在ReplaceWith當中,我們寫上要替換成的語句!注意:在ReplaceWith中,因為不需要進行正則查找,所以符號可以直接輸,不用“\”轉義,但”\”別有他用,用”\index”表示搜索式中被標記的第index個內容,index從1開始,"\0“表示搜索到的原內容。所以我們的ReplaceWith填\1=rdr.GetInt32("\1",\2)開始替換。

替換前:

替換后:

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

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

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

2.轉義: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.標記:<{:i}>=rdr\.GetValue\(:z\)==DBNull.Value?{:z}\:rdr\.GetInt32\(:z\)

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

怎么樣?這個正則不太繁吧!


當前文章:詳解VisualStudio正則替換大法
文章分享:http://www.5511xx.com/article/djcjocg.html