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

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

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

  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) :匹配一行的开始。如果标志中包括多行搜索字符,它还将匹配\n或\r后面的位置。^另外一种意思:非!([^0-9])(用作括号表达式中的第一个字符)
  8. $ :匹配行结束符。如果标志中包括多行搜索字符,它还将匹配\n或\r前面的位置。

  简写表达式(d:digital;  s:space;  w:word.大写就是“非”)

  1. \d:代表一个数字,等同于[0-9]
  2. \D:代表非数字,等同于[^0-9]
  3. \s:代表换行符、Tab制表符等空白字符 ,(空格、回车、制表符)
  4. \S:代表非空白字符(%[email protected]@等)
  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希望这篇文章对您有所帮助。

时间: 2024-12-21 14:11:14

字符串转换为日期时间类型及正则式拾遗的相关文章

Mysql 建表时,日期时间类型选择

mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  DATETIME  8 bytes  YYYY-MM-DD HH:MM:SS  1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00  TIMESTAMP  4 bytes  YYYY-MM-DD HH:MM:SS  197001010

20160421字符串类型;日期时间类型数学类型

第13天 2016-04-21 一.字符串类型   string Trim() - 去头尾的空格,中间的空格不能去. ToUpper() - 把字符串的字母全变成大写. ToLower() - 把字符串的字母全变成小写. StartsWith("子串") - 是否以“子串”开头,是-true EndsWith("子串") - 是否以“子串”结尾,是-true Contains("子串") - 是否包含“子串”,是-true Substring(起

字符串类型||日期时间类型||数学运算

字符串类型: string Trim() - 去头尾的空格,中间的空格不能去. ToUpper() - 把字符串的字母全变成大写.ToLower() - 把字符串的字母全变成小写. StartsWith("子串") - 是否以“子串”开头,是-trueEndsWith("子串") - 是否以“子串”结尾,是-trueContains("子串") - 是否包含“子串”,是-true Substring(起始位置,长度) - 从大字符串中,截取小的子

js中字符串转换为日期和比较大小

本文转载于:http://yun342173024.iteye.com/blog/1873756在做前端校验的时候,要做日期比较的校验,在js中把字符串转化为日期,一时之间还真不知道在js中怎么把一个字符串格式的日期转化为Date,查看了一些资料,在此分享下. 下面以调用js中Date(year,month,day)来生成一个日期对象.  1.把字符串格式转换为日期的函数,函数接受两个参数,dateStr字符串日期格式,  separator日期格式分隔符,默认是-.,这里没有对字符串的日期格式

mysql日期时间类型总结

MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 ------------ ---------   --------------------- ----------------------------------------- datetime       8 bytes   YYYY-MM-DD HH:MM:SS   1000-01-01 00:00:00 ~ 9999-12-31

使用SimpleDateFormat注意的地方和在jsp中将字符串转换为日期

一.使用SimpleDateFormat注意的地方 SimpleDateFormat将字符串转换为日期类型时,转换的格式必须和字符串的格式一样,否则就会报错,比如:将字符串"20150825195057"转化为日期类型,转换格式必须是 "yyyyMMddHHmmss",如果是其他格式,将会报   java.text.ParseException: Unparseable date: "20150825195057"异常.那如果要将字符串转换成yy

MySQL学习分享-->日期时间类型

日期时间类型 ①如果要用来表示年月日时分秒,一般使用datetime类型: ②如果要用来表示年月日,一般使用date类型: ③如果要表示时分秒,一般使用time类型: ④如果只是表示年份,一般使用year类型,需要注意的是5.5.27版本之前(不包含该版本)year类型有2位和4位格式这两种表示,在5.5.27版本之后2位格式的year已经不再被支持,year类型的值都会以YYYY的格式显示. year(2)被弃用我个人的理解是因为两位的显示宽度使得该类型表示模糊.不明确(显示的值仅仅是最后两位

Python之字符串转换为日期、结合时区的日期操作

一.字符串转换为日期 方法一 s = '2019-01-20' print(datetime.strptime(s, '%Y-%m-%d')) # 2019-01-20 00:00:00 方法二 def parse_ymd(s): year_s, mon_s, day_s = s.split('-') return datetime(int(year_s), int(mon_s), int(day_s)) s = '2019-01-20' res = parse_ymd(s) print(res

MySQL之日期时间类型

mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示  DATETIME  8 bytes  YYYY-MM-DD HH:MM:SS  1000-01-01 00:00:00 9999-12-31 23:59:59  0000-00-00 00:00:00  TIMESTAMP  4 bytes  YYYY-MM-DD HH:MM:SS  19700101