免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
C#中的正則表達式

  其中如果包含的字符串中包含雙引號,那么就兩個雙引號表示,而不是反斜杠加上雙引號(\”),也不是斜杠加上雙引號(/”)

    正則表達式獲取CSS里面的圖片的例子,里面有URL里面的圖片地址有雙引號,要注意用兩個雙引號""表示

        static void Main(string[] args)        {            Regex reg = new Regex(@"url\((['""]?)(.+[^'""])\1\)");  //注意里面的引號 要用雙引號表示,而不是用反斜杠            Console.WriteLine(reg.Match(@"{background-image:url(//ssl.gstatic.com/ui/v1/menu/checkmark.png);backgro")); //輸出 url(//ssl.gstatic.com/ui/v1/menu/checkmark.png)            Console.ReadKey();        }

  帶組名的后向引用在C#中是 \k<num> ,匹配重復(fù)單詞的例子:

        static void Main(string[] args)        {            Regex reg = new Regex(@"\b(?<group>\w+ +)\k<group>");            string str = "what the hell are you you talking about?";            Console.WriteLine(reg.Match(str));            Console.ReadKey();        }

   在C#中new一個Regex對象的時候,第二個參數(shù)能夠用枚舉支持選擇匹配模式,現(xiàn)在就來說說這些枚舉值對正則的影響。

   模式              說明

   .SingleLine           點號能夠匹配任何字符
   .Multiline            擴展^和$的匹配,使^和$能夠匹配字符串內(nèi)部的換行符
   .IgnorePatternWhitespace   設(shè)計寬松排列和注釋模式
   .IgnoreCase          進行不區(qū)分大小寫的匹配
    .ECMAScript          限制\w \s \d,令其只對ASCII字符有效
   .RightToLeft          傳動裝置的驅(qū)動過程不變,但是方向相反(從字符的末尾開始,向開頭移動)
   .Compiled           多花些時間優(yōu)化正則表達式,編譯到dll里,占用多點內(nèi)存,但是匹配更快。
   .ExplicitCapture        普通括號()在正常情況下是捕獲型括號,但是在此模式下與(?:...)一樣,之分組,不捕獲

 

    RegexOptions.Compiled的意義

  使用RegexOptions.Compiled與不使用RegexOptions.Compiled的對比

  標準      不使用          使用

  啟動速度    較快           較慢(最多60倍)
  內(nèi)存占用    少            多(每個正則表達式占用5-15KB)
  匹配速度    一般           最多能提升10倍

  在使用了RegexOptons.Compiled時,在程序執(zhí)行過程中,這塊內(nèi)存會一直被占用,無法被釋放,因此僅對于那些經(jīng)常被使用的正則表達式才適合使用此選項。

  ECMAScript模式

  要注意ECMAScript只能與下面的選項同時使用

  RegexOptons.IgnoreCase
  RegexOptons.Multiline
  RegexOptons.Compiled

  而且反斜線-數(shù)字不會有反向引用和十進制轉(zhuǎn)移的二義性,因為它只能夠表示反向引用。例如 \10 表示反向引用 \1 然后是文字0。如果沒有啟用該模式,則 \12 匹配的是ASCII進紙符linefeed。同時\w \d \s \W \D \S只能匹配ASCII。

  另外在C#中,分組的編號也需要注意。

  分組0是整個正則表達式匹配到的結(jié)果。

  然后依次是未命名分組。

  最后是命名分組。

  例如:

  (\w)(?<Num>\d+)(\s+)

   1   3     2

   特殊的Replacement處理

  Regex.Replace方法和Match.Result方法都可以接收能夠進行特殊處理的replacement字符串。下面的字符序列會被匹配到的文本所替換:

  字符序列          替換內(nèi)容

  $&              整個表達式匹配的文本,相當于$0

  $1  $2            對應(yīng)編號的捕獲分組所匹配的文本

  ${name}          對應(yīng)命名捕獲分組匹配的文本

  $‘             目標字符串中匹配文本之前的文本

  $'             目標字符串中匹配文本之后的文本

    $$             單個$字符($1的顯示為$$!)

  $_             正則原始目標字符串的副本

  $+             .NET中表示最后的那個捕獲型括號匹配的文本

 

static void Main(string[] args)        {            Regex reg1 = new Regex(@"\d+");            string str = reg1.Replace("123","insert into table where id = $&");            Console.WriteLine(str);     //輸出 insert into table where id = 123            Regex reg2 = new Regex(@"1\+1=(\d)");            string str2 = reg2.Replace("1+1=3","不是$1");            Console.WriteLine(str2);    //輸出 不是3            Regex reg3 = new Regex(@"1\+1=(?<result>\d)");            string str3 = reg3.Replace("1+1=3", "不是${result}");            Console.WriteLine(str3);    //輸出 不是3            Regex reg4 = new Regex(@"\d+");            string str4 = reg4.Replace("123ABC", "后面是$'");  //匹配文本之后的文本            Console.WriteLine(str4);    //輸出 后面是ABCABC     為什么會輸出 后面是ABCABC呢?因為$'指的是ABC,然后替換掉原字符串中的123。不懂看多幾次這句話            Regex reg5 = new Regex(@"\d+");            string str5 = reg5.Replace("ABC123", "前面是$`");  //ABC前面是ABC 符號是 1左邊那個            Console.WriteLine(str5);            Regex reg6 = new Regex(@"\d+");            string str6 = reg6.Replace("ABC123","右邊原始輸入字符串$_");            Console.WriteLine(str6);    //輸出 右邊是原始字符串ABC123            Console.ReadKey();        }

關(guān)于.net中的正則裝配件是用于構(gòu)建正則表達式庫的,保存在硬盤中,其他程序也能夠調(diào)用,提高重用率。主要就是用到了Regex類的CompileToAssembly方法。   

2013-4-26  微雨,陰霾

今天,碰到一個非常有趣的問題,公司多了個客戶,產(chǎn)品那邊說添加關(guān)鍵詞太辛苦,讓我?guī)兔ε繉胍慌P(guān)鍵詞。哥這幾天正好在研究正則表達式呢,于是二話不說,立馬應(yīng)了下來。一看,Excel,算了NPOI還沒學呢。于是復(fù)制到txt文本里。
格式如下:
中山大道
粵墾路
.....
天助我也,難度不大,而且看來這幾天學的東西有用武之地了。于是立馬有了以下代碼

static void Main(string[] args){  string str = File.ReadAllText(@"D:\daoru.txt", Encoding.Default);  Regex reg = new Regex(@".+");  string str1 = reg.Replace(str, "insert into Keyword values(196,'admin1','admin1','$&')");  File.WriteAllText(@"D:\123.txt", str1);  Console.ReadKey();}

  這是一個根據(jù)關(guān)鍵詞生成SQL語句的方法,從D盤導入txt文本(在這個地方,碰到一個問題,因為關(guān)鍵詞是中文,所以直覺上覺得應(yīng)該用Utf-8編碼去讀,但是竟然出錯了。于是上網(wǎng)查了一下,居然用Encoding.Default可以解決這個問題)。然后用正則表達式匹配到關(guān)鍵詞。默認的new Regex() 點號.是不會匹配換行符的,因此非常適合關(guān)鍵詞一行一個的,例如從Excel復(fù)制過來的時候。然后用Regex類提供的Replace將關(guān)鍵詞替換成Sql語句,直接黏貼到數(shù)據(jù)庫上全選,執(zhí)行。OK。一次過導入了近500個關(guān)鍵詞。

2013-4-27    晴

  本來以為正則表達式學得不錯了,結(jié)果昨天替換的SQL語句就出了問題,存入數(shù)據(jù)庫的數(shù)據(jù)無緣無故多了個換行符。其實在執(zhí)行SQL語句的時候,SQLSERVER已經(jīng)很盡職地給出提示了,可惜太大意或者說高興得太早直接忽略了。來看昨天SQL語句執(zhí)行時的圖片:

  看到換行了吧,這樣一來就會將在結(jié)果中多了個\r,在數(shù)據(jù)庫表中還看不到,但是在用的時候,如果僅僅用于顯示,也沒問題,但是如果用來匹配,那就悲劇了。因此今天更改了程序。要將換行符替換掉。代碼改為如下所示,其中改動部分紅色標記:

        static void Main(string[] args)        {            string str = File.ReadAllText(@"D:\daoru.txt", Encoding.Default);            Regex reg = new Regex(@".+");            string str1 = reg.Replace(str, "insert into JM_SinaBlog_KeyWord values(105,'jmeii','jmeii','$&')").Replace((char)13, (char)0);//here            File.WriteAllText(@"D:\123.txt", str1);            Console.ReadKey();        }

  這樣一來,就替換掉換行符了。將生成的代碼再復(fù)制到SQLSERVER里,可以看到SQLSERVER的顯示變了:

  

  這樣就沒問題了,以后在寫正則表達式時要對換行,空格非常敏感才行。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
正則表達式 (正則表達式括號的作用)
最火的正則表達式,學起來
java中關(guān)于正則表達式的基本使用
C#判斷字符串中是否含有漢字
把123456789轉(zhuǎn)換為12-345-6789的三種方法
正則表達式中\(zhòng)A,\z和^,$的區(qū)別
更多類似文章 >>
生活服務(wù)
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服