欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中的正則表達(dá)式雙引號(hào)問(wèn)題

 更新時(shí)間:2015年05月21日 19:14:24   投稿:mdxy-dxy  
正則表達(dá)式獲取CSS里面的圖片的例子,里面有URL里面的圖片地址有雙引號(hào),要注意用兩個(gè)雙引號(hào)表示

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

  正則表達(dá)式獲取CSS里面的圖片的例子,里面有URL里面的圖片地址有雙引號(hào),要注意用兩個(gè)雙引號(hào)""表示

static void Main(string[] args)
    {
      Regex reg = new Regex(@"url\((['""]?)(.+[^'""])\1\)"); //注意里面的引號(hào) 要用雙引號(hào)表示,而不是用反斜杠
      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一個(gè)Regex對(duì)象的時(shí)候,第二個(gè)參數(shù)能夠用枚舉支持選擇匹配模式,現(xiàn)在就來(lái)說(shuō)說(shuō)這些枚舉值對(duì)正則的影響。

   模式              說(shuō)明

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

     RegexOptions.Compiled的意義

  使用RegexOptions.Compiled與不使用RegexOptions.Compiled的對(duì)比

  標(biāo)準(zhǔn)      不使用          使用

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

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

  ECMAScript模式

  要注意ECMAScript只能與下面的選項(xiàng)同時(shí)使用

  RegexOptons.IgnoreCase
  RegexOptons.Multiline
  RegexOptons.Compiled

  而且反斜線-數(shù)字不會(huì)有反向引用和十進(jìn)制轉(zhuǎn)移的二義性,因?yàn)樗荒軌虮硎痉聪蛞?。例?\10 表示反向引用 \1 然后是文字0。如果沒(méi)有啟用該模式,則 \12 匹配的是ASCII進(jìn)紙符linefeed。同時(shí)\w \d \s \W \D \S只能匹配ASCII。

  另外在C#中,分組的編號(hào)也需要注意。
  分組0是整個(gè)正則表達(dá)式匹配到的結(jié)果。
  然后依次是未命名分組。
  最后是命名分組。

  例如:

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

   1   3     2

   特殊的Replacement處理

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

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

  $&              整個(gè)表達(dá)式匹配的文本,相當(dāng)于$0
  $1  $2            對(duì)應(yīng)編號(hào)的捕獲分組所匹配的文本
  ${name}          對(duì)應(yīng)命名捕獲分組匹配的文本
  $‘             目標(biāo)字符串中匹配文本之前的文本
  $'             目標(biāo)字符串中匹配文本之后的文本
    $$             單個(gè)$字符($1的顯示為$$!)
  $_             正則原始目標(biāo)字符串的副本
  $+             .NET中表示最后的那個(gè)捕獲型括號(hào)匹配的文本

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   為什么會(huì)輸出 后面是ABCABC呢?因?yàn)?'指的是ABC,然后替換掉原字符串中的123。不懂看多幾次這句話

      Regex reg5 = new Regex(@"\d+");
      string str5 = reg5.Replace("ABC123", "前面是$`"); //ABC前面是ABC 符號(hào)是 1左邊那個(gè)
      Console.WriteLine(str5);

      Regex reg6 = new Regex(@"\d+");
      string str6 = reg6.Replace("ABC123","右邊原始輸入字符串$_");
      Console.WriteLine(str6);  //輸出 右邊是原始字符串ABC123

      Console.ReadKey();
    }

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

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

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();
}

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

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

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

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();
    }

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

這樣就沒(méi)問(wèn)題了,以后在寫(xiě)正則表達(dá)式時(shí)要對(duì)換行,空格非常敏感才行。

相關(guān)文章

  • c#壓縮字符串的方法

    c#壓縮字符串的方法

    這篇文章主要介紹了c#壓縮字符串的方法,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Unity?UGUI的Canvas畫(huà)布組件使用示例詳解

    Unity?UGUI的Canvas畫(huà)布組件使用示例詳解

    這篇文章主要介紹了Unity?UGUI的Canvas畫(huà)布組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • C# 中的IComparable和IComparer的使用及區(qū)別

    C# 中的IComparable和IComparer的使用及區(qū)別

    這篇文章主要介紹了C# 中的IComparable和IComparer的使用及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • C# TreeView控件使用代碼

    C# TreeView控件使用代碼

    TreeView控件的實(shí)例代碼,需要的朋友可以參考下。
    2009-09-09
  • C#基于Socket實(shí)現(xiàn)多人聊天功能

    C#基于Socket實(shí)現(xiàn)多人聊天功能

    這篇文章主要為大家詳細(xì)介紹了C#基于Socket實(shí)現(xiàn)多人聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c#基礎(chǔ)系列之值類型和引用類型的深入理解

    c#基礎(chǔ)系列之值類型和引用類型的深入理解

    這篇文章主要給大家介紹了關(guān)于c#基礎(chǔ)系列之值類型和引用類型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • C#中委托的進(jìn)一步理解

    C#中委托的進(jìn)一步理解

    這篇文章主要介紹了C#中委托的進(jìn)一步理解,本文講解了委托類型、建立委托鏈、移除委托鏈等內(nèi)容,需要的朋友可以參考下
    2015-02-02
  • C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法)

    C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法)

    本文主要介紹了C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#獲取DataTable對(duì)象狀態(tài)DataRowState

    C#獲取DataTable對(duì)象狀態(tài)DataRowState

    這篇文章介紹了C#獲取DataTable對(duì)象狀態(tài)DataRowState的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Unity3D快速入門教程

    Unity3D快速入門教程

    本文講述了Unity3D如何快速入門,包含Unity3D游戲引擎介紹,學(xué)習(xí)歷程和Unity3D快速入門的途徑,通過(guò)該篇文章的講解,希望能夠讓你更好的去學(xué)習(xí)Unity3D引擎
    2021-06-06

最新評(píng)論