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

Why the Address tag never gets read from a vcard?

您好,我有一个读取电子名片的小应用程序。奇怪的是地址永远不会被读取。我有一个我尝试使用的小样本 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 的工作正则表达式的例子:

@"(?<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)?) ))?";

正则表达式始终遵循相同的模式,但不知何故它不适用于始终为空的地址。我不知道为什么。我用 google 和一个关于 codeproject 的教程试过了,但到目前为止运气不好。我知道周围有图书馆,但我应该使用正则表达式。

因此,任何帮助或建议都将非常有用,感谢您的宝贵时间。

您的正则表达式与 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)。