字符串转换为日期时间类型及正则式拾遗

  菜鸟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. .:匹配除换行符 之外的任何单个字符。“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),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。

  限定符:限定前面的正则表达式出现的次数。

  1. *: 0至多次匹配在它之前的子表达式 
  2. + :一次或多次匹配前面的子表达式。如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
  3. ? :零次或一次匹配前面的子表达式。例如,“do(es)?” 可以匹配 “do” 或 “does” 。一般用来匹配“可选部分”。(终止贪婪模式)
  4. {n} :匹配确定的 n 次。“zo{2}”→zoo。
  5. {n,} :至少匹配n次。
  6. {n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。 {2,5}//bed,seed,seeed;beeeeed错误。
  7. ^(shift+6) :匹配一行的开始。如果标志中包括多行搜索字符,它还将匹配 或 后面的位置。^另外一种意思:非!([^0-9])(用作括号表达式中的第一个字符)
  8. $ :匹配行结束符。如果标志中包括多行搜索字符,它还将匹配 或 前面的位置。
  简写表达式(d:digital;  s:space;  w:word.大写就是“非”)
  1. d:代表一个数字,等同于[0-9]  
  2. D:代表非数字,等同于[^0-9]
  3. s:代表换行符、Tab制表符等空白字符 ,(空格、回车、制表符)
  4. S:代表非空白字符(%$@@等)
  5. w:匹配字母或数字或下划线或汉字,即能组成单词的字符,除%&#@!$等字符。[a-zA-Z0-9_汉字] 
  6. W:非w ,等同于[^w] %

  正则表达式中的转义符也是。由于. 在正则表达式中有特殊的含义,因此对于真正想表达”.”则需要转移“.”。

  字符串提取
  1. 编写一个符合数字的正则表达式  string reg=”…”;
  2. 返回提取结果  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希望这篇文章对您有所帮助。

 

原文地址:https://www.cnblogs.com/cnDqf/p/4260391.html