程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中的正則表達式雙引號成績

C#中的正則表達式雙引號成績

編輯:C#入門知識

C#中的正則表達式雙引號成績。本站提示廣大學習愛好者:(C#中的正則表達式雙引號成績)文章只能為提供參考,不一定能成為您想要的結果。以下是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> ,婚配反復單詞的例子:

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對象的時刻,第二個參數可以或許用列舉支撐選擇婚配形式,如今就來講說這些列舉值對正則的影響。

   形式              解釋

   .SingleLine           點號可以或許婚配任何字符
   .Multiline            擴大^和$的婚配,使^和$可以或許婚配字符串外部的換行符
   .IgnorePatternWhitespace   設計寬松分列和正文形式
   .IgnoreCase          停止不辨別年夜小寫的婚配
    .ECMAScript          限制\w \s \d,令其只對ASCII字符有用
   .RightToLeft          傳動裝配的驅動進程不變,然則偏向相反(從字符的末尾開端,向開首挪動)
   .Compiled           多花些時光優化正則表達式,編譯到dll裡,占用多點內存,然則婚配更快。
   .ExplicitCapture        通俗括號()在正常情形下是捕捉型括號,然則在此形式下與(?:...)一樣,之分組,不捕捉

     RegexOptions.Compiled的意義

  應用RegexOptions.Compiled與不應用RegexOptions.Compiled的比較

  尺度      不應用          應用

  啟動速度    較快           較慢(最多60倍)
  內存占用    少            多(每一個正則表達式占用5-15KB)
  婚配速度    普通           最多能晉升10倍

  在應用了RegexOptons.Compiled時,在法式履行進程中,這塊內存會一向被占用,沒法被釋放,是以僅關於那些常常被應用的正則表達式才合適應用此選項。

  ECMAScript形式

  要留意ECMAScript只能與上面的選項同時應用

  RegexOptons.IgnoreCase
  RegexOptons.Multiline
  RegexOptons.Compiled

  並且反斜線-數字不會有反向援用和十進制轉移的二義性,由於它只可以或許表現反向援用。例如 \10 表現反向援用 \1 然後是文字0。假如沒有啟用該形式,則 \12 婚配的是ASCII進紙符linefeed。同時\w \d \s \W \D \S只能婚配ASCII。

  別的在C#中,分組的編號也須要留意。
  分組0是全部正則表達式婚配到的成果。
  然後順次是未定名分組。
  最初是定名分組。

  例如:

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

   1   3     2

   特別的WordStrment處置

  Regex.WordStr辦法和Match.Result辦法都可以吸收可以或許停止特別處置的replacement字符串。上面的字符序列會被婚配到的文本所調換:

  字符序列          調換內容

  $&              全部表達式婚配的文本,相當於$0
  $1  $2            對應編號的捕捉分組所婚配的文本
  ${name}          對報命名捕捉分組婚配的文本
  $‘             目的字符串中婚配文本之前的文本
  $'             目的字符串中婚配文本以後的文本
    $$             單個$字符($1的顯示為$$!)
  $_             正則原始目的字符串的正本
  $+             .NET中表現最初的誰人捕捉型括號婚配的文本

static void Main(string[] args)
    {
      Regex reg1 = new Regex(@"\d+");
      string str = reg1.WordStr("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.WordStr("1+1=3","不是$1");
      Console.WriteLine(str2);  //輸入 不是3

      Regex reg3 = new Regex(@"1\+1=(?<result>\d)");
      string str3 = reg3.WordStr("1+1=3", "不是${result}");
      Console.WriteLine(str3);  //輸入 不是3

      Regex reg4 = new Regex(@"\d+");
      string str4 = reg4.WordStr("123ABC", "前面是$'"); //婚配文本以後的文本
      Console.WriteLine(str4);  //輸入 前面是ABCABC   為何會輸入 前面是ABCABC呢?由於$'指的是ABC,然後調換失落原字符串中的123。不懂看多幾回這句話

      Regex reg5 = new Regex(@"\d+");
      string str5 = reg5.WordStr("ABC123", "後面是$`"); //ABC後面是ABC 符號是 1右邊誰人
      Console.WriteLine(str5);

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

      Console.ReadKey();
    }

關於.net中的正則拆卸件是用於構建正則表達式庫的,保留在硬盤中,其他法式也可以或許挪用,進步重用率。重要就是用到了Regex類的CompileToAssembly辦法。   

明天,碰著一個異常風趣的成績,公司多了個客戶,產物那裡說添加症結詞太辛勞,讓我協助批量導入一批症結詞。哥這幾天正好在研討正則表達式呢,因而二話不說,立馬應了上去。一看,Excel,算了NPOI還沒學呢。因而復制到txt文本裡。
格局以下:
中山年夜道
粵墾路
.....
天佑我也,難度不年夜,並且看來這幾天學的器械有效武之地了。因而立馬有了以下代碼

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

  Console.ReadKey();
}

這是一個依據症結詞生成SQL語句的辦法,從D盤導入txt文本(在這個處所,碰著一個成績,由於症結詞是中文,所以直覺上認為應當用Utf-8編碼去讀,然則居然失足了。因而上彀查了一下,竟然用Encoding.Default可以處理這個成績)。然後用正則表達式婚配到症結詞。默許的new Regex() 點號.是不會婚配換行符的,是以異常合適症結詞一行一個的,例如從Excel復制過去的時刻。然後用Regex類供給的WordStr將症結詞調換成Sql語句,直接黏貼到數據庫上全選,履行。OK。一次過導入了近500個症結詞。

  原來認為正則表達式學得不錯了,成果昨天調換的SQL語句就出了成績,存入數據庫的數據事出有因多了個換行符。其其實履行SQL語句的時刻,SQLSERVER曾經很失職地給出提醒了,惋惜太年夜意或許說愉快得太早直接疏忽了。來看昨天SQL語句履行時的圖片:

看到換行了吧,如許一來就會將在成果中多了個\r,在數據庫表中還看不到,然則在用的時刻,假如僅僅用於顯示,也沒成績,然則假如用來婚配,那就喜劇了。是以明天更改了法式。要將換行符調換失落。代碼改成以下所示,個中修改部門白色標志:

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

      Console.ReadKey();
    }

如許一來,就調換失落換行符了。將生成的代碼再復制到SQLSERVER裡,可以看到SQLSERVER的顯示變了:

如許就沒成績了,今後在寫正則表達式時要對調行,空格異常敏感才行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved