菜鳥D最經在給項目寫報文接口文件,不要理解錯誤啊,其實只是拼報文,解析報文。拼報文的過程沒有什么難度,此處只需要注意重構就好,報文一般都是有通用的格式的,例如報文是xml格式的,這時候要多對比不同報文的差異,盡量減少重復代碼。重構的最大目的在於即使代碼發生更改,不必嵌入太深。
好了,廢話完了,在解析報文時,遇到了一個“yyyyMMddHHmmss”格式的字符串需要轉換為DateTime類型,菜鳥D理所當然的用了Convert.ToDateTime(),由於初時並不知道獲取到的是一個怎樣的字符串,就這么寫了。當解析報文的時候,理所當然的就出錯了。Convert.ToDateTime()和DateTime.Parse()轉換字符串的格式需要“/”、“:”這樣的分隔符。
然后菜鳥D想到了正則表達式,但是由於手生(一年左右沒用過),花了半個多小時總算整出來了。先將解決方法放上:
string s = "21011212122334"; //yyyyMMddHHmmss
Regex reg = new Regex(@"^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$"); s = reg.Replace(s, "$1/$2/$3 $4:$5:$6"); // yyyy/MM/dd HH:mm:ss
代碼不多,三行就結束了。它的工作就是將字符串用正則匹配分段,最后根據我們的需要選擇合適段進行操作。分段(也叫分組),$0是整個正則式匹配到的結果,分段(分組)是以左括號(的順序為准,例如:((),,)()$1比$2多兩個字符','。
下面是早些時候學習的基礎及心得。
常用的3種情況(C#語法):
1.判斷一個字符串是否匹配某個正則表達式:Regex.IsMatch(“字符串”,”正則表達式”);2.字符串提取:Regex.Match(“字符串”,“要提取的字符串的正則表達式”);// 只能提取字符串中的第一個匹配的結果。(只能提取一個/次)。Regex.Matches(),(循環提取所有,可以提取所有匹配的字符串。)
3.字符串替換:Regex.Replace(“字符串”,”正則”,”替換內容”); 把所有匹配正則表達式的字符串替換為對應的字符串。
元字符:
1. .:匹配除換行符\n之外的任何單個字符。“b..g”可以匹配“buug”。
2.[ ] :匹配括號中的任何一個字符。如“b[aui]g”匹配bug、big和bag。可以使用連字符“-”來指定字符的區間來簡化表示,如”a[0-9]c”等價於”a[0123456789]c”;還可以制定多個區間,如”[A-Za-z0-9]”可以匹配任何的大小寫字母或者數字。”a[^0-9]c”,除了0-9任意一個數字
3.| :將兩個匹配條件進行邏輯“或”運算,優先級最低。‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 則匹配 “zood” 或 “food”。 //注意^$問題。
4.( ) :將 () 之間括起來的表達式定義為“組”(group),並且將匹配這個表達式的字符保存到一個臨時區域,這個元字符在字符串提取的時候非常有用。把一些字符表示為一個整體。改變優先級、定義提取組兩個作用。
限定符:限定前面的正則表達式出現的次數。
- *: 0至多次匹配在它之前的子表達式
- + :一次或多次匹配前面的子表達式。如正則表達式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
- ? :零次或一次匹配前面的子表達式。例如,“do(es)?” 可以匹配 “do” 或 “does” 。一般用來匹配“可選部分”。(終止貪婪模式)
- {n} :匹配確定的 n 次。“zo{2}”→zoo。
- {n,} :至少匹配n次。
- {n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”將匹配“seeeeeeeed”中的前三個“e”。 {2,5}//bed,seed,seeed;beeeeed錯誤。
- ^(shift+6) :匹配一行的開始。如果標志中包括多行搜索字符,它還將匹配\n或\r后面的位置。^另外一種意思:非!([^0-9])(用作括號表達式中的第一個字符)
- $ :匹配行結束符。如果標志中包括多行搜索字符,它還將匹配\n或\r前面的位置。
- \d:代表一個數字,等同於[0-9]
- \D:代表非數字,等同於[^0-9]
- \s:代表換行符、Tab制表符等空白字符 ,(空格、回車、制表符)
- \S:代表非空白字符(%$@@等)
- \w:匹配字母或數字或下划線或漢字,即能組成單詞的字符,除%&#@!$等字符。[a-zA-Z0-9_漢字]
- \W:非\w ,等同於[^\w] %
正則表達式中的轉義符也是\。由於. 在正則表達式中有特殊的含義,因此對於真正想表達”.”則需要轉移“\.”。
- 編寫一個符合數字的正則表達式 string reg=”…”;
- 返回提取結果 Match match=Regex.Match (msg, reg); Console.WriteLine (match.Value);
常用類:
Regex類,表示不可變的正則表達式
Match類,表示單個正則表達式匹配的結果。通過match.Groups[]來獲取提取組。注意:第0組存儲的是完整匹配字符串,要獲取組應該從索引1開始match.Groups [0].Value = match.Value
MatchCollection類,表示通過以迭代方式將正則表達式模式應用於輸入字符串所找到的成功匹配的集合。
貪婪(greedy)模式與非貪婪模式
當正則表達式提取的時候,如果1個字符也能匹配,多個字符也能匹配,這時,會按照使用最多字符的方式來匹配,這個就叫貪婪模式(默認)
?(問號), 終止貪婪模式(在限定符后面使用),會按最小的方式來匹配
string str=”1111。1 1。 1。 111。111111。”;
string regstr=”.+?。”;//結果:1111。因為.+? 表示終結貪婪模式,所以只能提取出來第一個1,但是后面還有個句號:。 ,所以為了匹配句號只能再向后搜索3個1,然后找到句號。所以就是1111。
貪婪模式比較常見,注意終結此模式,具體問題具體分析。
--------------------------------------------------------------------------------------------------------------
菜鳥D希望這篇文章對您有所幫助。