菜鸟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(“字符串”,”正则表达式”);元字符:
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),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
限定符:限定前面的正则表达式出现的次数。
正则表达式中的转义符也是\。由于. 在正则表达式中有特殊的含义,因此对于真正想表达”.”则需要转移“\.”。
常用类:
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希望这篇文章对您有所帮助。
原文:http://www.cnblogs.com/cnDqf/p/4260391.html