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的顯示變了:
如許就沒成績了,今後在寫正則表達式時要對調行,空格異常敏感才行。