为什么地址标记永远不会从vcard中读取?

时间:2016-06-15 09:10:23

标签: c# regex vcard

你好我有一个小应用程序读取vcards。奇怪的是,地址永远不会被读取。我有一个小样本vcard,我尝试使用。所以我们走了:

来自vcard的正则表达式的字符串:

"BEGIN:VCARDN:Huster;Hugo;;TestAdmin;HHUADR;INTL;PARCEL;WORK:;;Musterstra�e 10;Musterstadt;Niede�sterreich;3587;AustriaADR;DOM;PARCEL;HOME:;;Husterstra�e 10;Husterstadt;Wien;8897;AustriaEMAIL;INTERNET:hugo.huster@gmail.comEMAIL;INTERNET:hugo.huster@hotmail.comORG:Hugo GmbhTEL;WORK:12345678TEL;FAX;WORK:--342342TEL;CELL:45364321TEL;HOME:028560803TITLE:DeveloperURL;WORK:www.example.deURL:www.hug.atEND:VCARD"

这是我尝试用于地址的正则表达式:

@"(\n(?<strElement>(ADR))) (;*(?<strAttr>(HOME|WORK)))*  (:(?<strPo>([^;]*)))  (;(?<strBlock>([^;]*)))  (;(?<strStreet>([^;]*)))  (;(?<strCity>([^;]*))) (;(?<strRegion>([^;]*))) (;(?<strPostcode>([^;]*)))(;(?<strNation>[^\n\r]*))";

以及我使用它的代码:

case "ADR":
    regex = @"(\n(?<strElement>(ADR))) (;*(?<strAttr>(HOME|WORK)))*  (:(?<strPo>([^;]*)))  (;(?<strBlock>([^;]*)))  (;(?<strStreet>([^;]*)))  (;(?<strCity>([^;]*))) (;(?<strRegion>([^;]*))) (;(?<strPostcode>([^;]*)))(;(?<strNation>[^\n\r]*))";
    mc = regex.Matches(vCardLine);
    if (mc.Count > 0)
    {
        for (int i = 0; i < mc.Count; i++)
        {
            VCardComponents.Address address = new VCardComponents.Address();
            v.Addresses.Add(address);
            m = mc[i];
            ss = m.Groups["strAttr"].Value;
            if (ss == "HOME")
                address.HomeWorkType = VCardComponents.HomeWorkTypes.HOME;
            else if (ss == "WORK")
                address.HomeWorkType = VCardComponents.HomeWorkTypes.WORK;

            address.POBox = m.Groups["strPo"].Value;
            address.Ext = m.Groups["strBlock"].Value;
            address.Street = m.Groups["strStreet"].Value;
            address.Locality = m.Groups["strCity"].Value;
            address.Region = m.Groups["strRegion"].Value;
            address.Postcode = m.Groups["strPostcode"].Value;
            address.Country = m.Groups["strNation"].Value;
        }
    }
    break;

这里例如是Org的正则Regex:

@"(?<strElement>(ORG)) ((;(ENCODING=)?(?<strAttr>(QUOTED-PRINTABLE)))|(;CHARSET=UTF-?8))*  (:(?<strORG>(([^;^\n\r]*(=\n\r)?)*[^;^\n\r]*[^;]*(\n\r)?) ))(;(?<strDept>(([^;^\n\r]*(=\n\r)?)*[^;^\n\r]*[^;]*(\n\r)?) ))?";

正则表达式总是遵循相同的模式但不知何故它不适用于Adresses它始终为null。我不知道为什么。我尝试使用谷歌和codeproject的教程但到目前为止没有运气。我知道周围有libarys,但我应该使用正则表达式。

所以任何帮助或建议对你来说都很棒。

1 个答案:

答案 0 :(得分:0)

您的正则表达式与ADR属性不匹配。

您的ADR字段包含参数

INTL;PARCEL;WORK
DOM;PARCEL;HOME

但您的正则表达式仅允许HOMEWORK

请注意,您的VCARD使用已弃用的VCard 2.1语法。我建议切换到VCard 3.0或vCard 4.0。

另请注意,解析属性的方法还有很多问题。解析较新的vCard 3.0或vCard 4.0语法时,它将失败。如果值包含\;之类的转义序列,它也将失败,如果行折叠,它将失败(请参阅RFC 6350)。