TZID=America/Chicago:20120504T130000DTSTAMP:20120504T164000ZDTSTART;TZID=America/Chicago:20120504T120000LAST-12T60Z40SQURE:2SUMMARY:Test1TRANSP:OPAQUEUID:21F61281-FB76-467F-A2CC-A666688BD9B5X-RADICALE-NAME:21F61281-FB76-467F-A2CC-A666688BD9B5.icsEND:VEVENT我需要取冒号或者每行上的分号并将它们放入对象的道具中。我正在尝试用Regex来做这件事,但在使用它之后我基本上忘记了我所知道的关于Regex的一切(可能一年两次)。任何帮助将不胜感激。通过一些示例运行它,看看它是否符合您的要求。我收到了关于拆分或IndexOf的其他评论,但如果您希望分隔符是冒号或分号,那么正则表达式可能会更好。字符串行=“最后修改:20120504T163940Z”;varp=Regex.Match(line,"(.*)?(:|;)(.*)$",RegexOptions.CultureInvariant|RegexOptions.IgnoreCase|RegexOptions.Singleline);Console.WriteLine(p.Groups[0].Value);Console.WriteLine(p.Groups[1].Value);Console.WriteLine(p.Groups[2].Value);Console.WriteLine(p.Groups[3].Value);编辑这个让我想到了iCal格式。昨天之前,我还不知道什么是iCal格式。然而,在阅读了1998年的规范之后,很明显这个页面上的所有答案都不足以解析内容。而且,即使对于我的一般正则表达式,它也非常复杂。考虑到这一点,这里有一个解析行内容的解决方案,从通用行内容解析规范中收集而来。这是朝着正确方向迈出的一步,希望有人能从中受益。它不会继续该行,也不会进行身份验证。C#代码RegexiCalMainRx=newRegex(@"^(?[^[:cntrl:]"";:,n]+)(?;(?[^[:cntrl:]"";:,n]+)=(?(?:(?:[^Sn]|[^[:cntrl:]"";:,])*|""(?:[^Sn]|[^[:cntrl:]""])*"")(?:,(?:(?:[^Sn]|[^[:cntrl:]"";:,])*|""(?:[^Sn]|[^[:cntrl:]""])*""))*))*:(?(?:[^Sn]|[^[:cntrl:]])*)$",RegexOptions.IgnorePatternWhitespace);RegexiCalPvalRx=newRegex(@"^(?(?:[^Sn]|[^[:cntrl:]";:,])*|""(?:[^Sn]|[^[:cntrl:]""])*"")(?:,+(?(?:[^Sn]|[^[:cntrl:]"";:,])*|""(?:[^Sn]|[^[:cntrl:]""])*""))*$",RegexOptions.IgnorePatternWhitespace);string[]lines={"BEGIN:VEVENT","CREATED:20120504T163940Z","DTEND;TZID=America/Chicago:20120504T130000","DTSTAMP:20120504T164000Z","DTSTART;TZID=,,,America/Chicago;Next=;last="this:;;;:=";final=:20120504T120000","LAST-MODIFIED:20120504T163940Z","SEQUENCE:0","SUMMARY:Test1","TRANSP:OPAQUE","UID:21F61281-FB76-467F-A2CC-A666688BD9B5","X-RADICALE-NAME:21F61281-FB76-467F-A2CC-A666688BD9B5.ics","结束:VEVENT",};foreach(stringstrinlines){Matchm_content=iCalMainRx.Match(str);如果(m_content.Success){Console.WriteLine("Key="+m_content.Groups["name"].Value);Console.WriteLine("Value="+m_content.Groups["value"].Value);CaptureCollectioncc_pname=m_content.Groups["param_name"].Captures;CaptureCollectioncc_pvalue=m_content.Groups["param_value"].Captures;if(cc_pname.Count>0){Console.WriteLine("参数:");for(inti=0;i产量Key=BEGINValue=VEVENT----------------------Key=CREATEDValue=20120504T163940Z----------------------Key=DTENDValue=20120504T130000Parameters:'TZID'='America/Chicago'------------------------键=DTSTAMP值=20120504T164000Z----------------------键=DTSTART值=20120504T120000参数:'TZID'='''美国/芝加哥''Next'='''last'='"this:;;;:="''final'=''------------------------键=LAST-MODIFIED值=20120504T163940Z-------------------------Key=SEQUENCEValue=0-------------------------Key=SUMMARYValue=Test1----------------------Key=TRANSPValue=OPAQUE------------------------键=UID值=21F61281-FB76-467F-A2CC-A666688BD9B5-----------------------键=X-RADICALE-NAME值=21F61281-FB76-467F-A2CC-A666688BD9B5.ics--------------------------Key=ENDValue=VEVENT----------------------吐到行中并使用IndexOf(":")可能足以代替简单的ICAL文件不是RegEx检查ICAL解析器是否已经存在以及ical+C#的相关问题。尝试:(?[^:;]*)[:;](?[^s]*)C#片段:Regexregex=newRegex(@"(?[^:;]*)[:;](?[^s]*)",RegexOptions.None);它采用任意字符的字符串,但以冒号或分号作为键,然后除空格外的任何字符作为值。如果您想对其进行测试或进行更改,请在博客上查看我的正则表达式检查器:http://blog.stevekonves.com/2012/01/an-even-better-regex-tester/(需要silverlight)我个人使用string.Split(':')用于文件中的每一行。如果您不想再次重新学习正则表达式,这样做的好处是易于阅读和理解!以上是C#学习教程:c#regex解析ical格式的文件,并用结果填充共享对象的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
