Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#regex以ical格式解析文件并用结果填充对象_C#_Regex_Parsing_Icalendar - Fatal编程技术网

c#regex以ical格式解析文件并用结果填充对象

c#regex以ical格式解析文件并用结果填充对象,c#,regex,parsing,icalendar,C#,Regex,Parsing,Icalendar,我正在尝试分析具有以下格式的文件: BEGIN:VEVENT CREATED:20120504T163940Z DTEND;TZID=America/Chicago:20120504T130000 DTSTAMP:20120504T164000Z DTSTART;TZID=America/Chicago:20120504T120000 LAST-MODIFIED:20120504T163940Z SEQUENCE:0 SUMMARY:Test 1 TRANSP:OPAQUE UID:21F612

我正在尝试分析具有以下格式的文件:

BEGIN:VEVENT
CREATED:20120504T163940Z
DTEND;TZID=America/Chicago:20120504T130000
DTSTAMP:20120504T164000Z
DTSTART;TZID=America/Chicago:20120504T120000
LAST-MODIFIED:20120504T163940Z
SEQUENCE:0
SUMMARY:Test 1
TRANSP:OPAQUE
UID:21F61281-FB76-467F-A2CC-A666688BD9B5
X-RADICALE-NAME:21F61281-FB76-467F-A2CC-A666688BD9B5.ics
END:VEVENT

我需要在每行的冒号或分号后面找到值,并将它们放入对象中的道具中。我正试图用Regex来做这件事,但我基本上忘记了我使用Regex后所知道的一切(可能一年两次)。任何帮助都将不胜感激。

对于简单的ICAL文件而不是正则表达式,插入行并使用IndexOf(“:”)就足够了


检查是否已经存在ICAL解析器。

我个人会对文件中的每一行使用string.Split(“:”)。如果您不想再次学习正则表达式,这也有易于阅读和理解的好处

试试看:

(?<key>[^:;]*)[:;](?<value>[^\s]*)
(?[^:;]*)[:;](?[^\s]*)
C#代码片段:

Regex Regex=new Regex(
@“(?[^:;]*)[:;](?[^\s]*)”,
RegExceptions。无
);
它以除冒号或分号以外的任何字符的字符串作为键,然后以除空格以外的任何字符作为值


如果您想测试它或进行更改,请查看我在我的博客上的正则表达式检查器:(需要silverlight)

用几个例子来运行它,看看它是否符合您的要求。我得到了关于拆分或IndexOf的其他注释,但是如果您希望分隔符是冒号或分号,那么正则表达式可能更好

string line = "LAST-MODIFIED:20120504T163940Z";
var p = 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#代码


为什么不为此使用
string.Split
?Split可能不起作用。。。我不记得“:”是否在ICAL中每行只显示一个。为什么不使用一个呢?我已经尝试过了,在这里找到的几个正则表达式想法都失败了,但是我没有任何代码了。就拆分而言,有一些道具使用:和一些道具使用多个;。其他的建议可能会奏效,但这是我第一次尝试的建议,它奏效了。谢谢很遗憾,这不会解析iCal内容行。@sln您有什么建议吗?我用我标记的答案来满足我的要求。在进一步测试之后,我可能需要对它进行一些调整,但到目前为止它仍然有效。我们只需要基本字段-这是一种享受。谢谢分享。
string line = "LAST-MODIFIED:20120504T163940Z";
var p = 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);
Regex iCalMainRx = new Regex(
 @" ^  (?<name> [^[:cntrl:]"";:,\n]+ )
       (?<parameter>
          ;
          (?<param_name> [^[:cntrl:]"";:,\n]+ )
           = 
          (?<param_value> 
             (?: (?:[^\S\n]|[^[:cntrl:]"";:,])*  | "" (?:[^\S\n]|[^[:cntrl:]""])* "" )
             (?: , (?: (?:[^\S\n]|[^[:cntrl:]"";:,])*  | "" (?:[^\S\n]|[^[:cntrl:]""])* "" ) )*
          )
        )*
        :
        (?<value> (?:[^\S\n]|[^[:cntrl:]])* )
     $ ", RegexOptions.IgnorePatternWhitespace);

Regex iCalPvalRx = new Regex(
 @" ^ (?<pvals> (?:[^\S\n]|[^[:cntrl:]"";:,])*  | "" (?:[^\S\n]|[^[:cntrl:]""])* "" )
      (?: ,+ (?<pvals> (?:[^\S\n]|[^[:cntrl:]"";:,])*  | "" (?:[^\S\n]|[^[: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:Test 1", 
    "TRANSP:OPAQUE", 
    "UID:21F61281-FB76-467F-A2CC-A666688BD9B5", 
    "X-RADICALE-NAME:21F61281-FB76-467F-A2CC-A666688BD9B5.ics", 
    "END:VEVENT", 
};

foreach (string str in lines)
{
    Match m_content = iCalMainRx.Match( str );
    if (m_content.Success)
    {
        Console.WriteLine("Key =   " + m_content.Groups["name"].Value);
        Console.WriteLine("Value = " + m_content.Groups["value"].Value);

        CaptureCollection cc_pname  = m_content.Groups["param_name"].Captures;
        CaptureCollection cc_pvalue = m_content.Groups["param_value"].Captures;
        if (cc_pname.Count > 0)
        {
            Console.WriteLine("Parameters: ");
            for (int i = 0; i < cc_pname.Count; i++)
            {
                // Console.WriteLine("\t'" + cc_pname[i].Value + "'  =   '" + cc_pvalue[i].Value + "'");
                Console.WriteLine("\t'" + cc_pname[i].Value + "' =");
                Match m_vals = iCalPvalRx.Match( cc_pvalue[i].Value );
                if (m_vals.Success)
                {
                    CaptureCollection cc_vals = m_vals.Groups["pvals"].Captures;
                    for (int j = 0; j < cc_vals.Count; j++)
                    {
                        Console.WriteLine("\t\t'" + cc_vals[j].Value + "'");
                    }
                }

            }
        }
        Console.WriteLine("-------------------------");
    }
}
Key =   BEGIN
Value = VEVENT
-------------------------
Key =   CREATED
Value = 20120504T163940Z
-------------------------
Key =   DTEND
Value = 20120504T130000
Parameters:
        'TZID' =
                'America/Chicago'
-------------------------
Key =   DTSTAMP
Value = 20120504T164000Z
-------------------------
Key =   DTSTART
Value = 20120504T120000
Parameters:
        'TZID' =
                ''
                'America/Chicago'
        'Next' =
                ''
        'last' =
                '"this:;;;:="'
        'final' =
                ''
-------------------------
Key =   LAST-MODIFIED
Value = 20120504T163940Z
-------------------------
Key =   SEQUENCE
Value = 0
-------------------------
Key =   SUMMARY
Value = Test 1
-------------------------
Key =   TRANSP
Value = OPAQUE
-------------------------
Key =   UID
Value = 21F61281-FB76-467F-A2CC-A666688BD9B5
-------------------------
Key =   X-RADICALE-NAME
Value = 21F61281-FB76-467F-A2CC-A666688BD9B5.ics
-------------------------
Key =   END
Value = VEVENT
-------------------------