【问题标题】:Why the Address tag never gets read from a vcard?为什么永远不会从 vcard 中读取地址标签?
【发布时间】:2016-06-15 09:10:22
【问题描述】:

您好,我有一个读取 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)?) ))?";

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

因此,任何帮助或建议都会非常好,感谢您的时间。

【问题讨论】:

  • 您不能将代码减少到最低限度以帮助我们更快地帮助您吗?我针对您提供的字符串尝试了您的正则表达式,但它根本不匹配该字符串。
  • 好吧,我试图将其减少到最低限度。该代码只是许多情况下的一部分 switch 语句。 Mabey 我应该在读取 vcard 时发布字符串?我只是用 textBox1.Text = File.ReadAllText(openFileDialog1.FileName); Mabey 我应该发布这段代码吗?
  • 只是字符串,您针对它运行的正则表达式,不匹配但应该匹配的内容。你简单的电子名片——我猜——是输入。它下面的正则表达式与字符串不匹配。
  • 希望它现在更清晰。有带有 case 的 switch 语句。因此,当出现 ADR 案例时,它应该使用 ADR 正则表达式。
  • 您是否有理由更喜欢自己编写此代码而不是例如使用其他人已经编写和调试过的库或代码?例如。快速搜索发现 EWSoftware/PDI 似乎已经有一个 VCard 解析器。

标签: c# regex vcf-vcard


【解决方案1】:

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

【讨论】:

  • 感谢它现在可以工作了。关于 vCard 版本,再次感谢我的工作。没有注意到这是我第一次尝试使用 REGEX 和 vCards。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2015-01-18
  • 2011-08-04
相关资源
最近更新 更多