为什么永远不会从 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
但是您的正则表达式只允许 HOME
和 WORK
。
请注意,您的 VCARD 使用已弃用的 VCard 2.1 语法。我建议切换到 VCard 3.0 或 vCard 4.0。
另外请注意,您解析属性的方式还有一些问题。解析较新的 vCard 3.0 或 vCard 4.0 语法时会失败。如果值包含像 \;
这样的转义序列,它也会失败,如果行被折叠,它也会失败(参见 RFC 6350)。
您好,我有一个读取电子名片的小应用程序。奇怪的是地址永远不会被读取。我有一个我尝试使用的小样本 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
但是您的正则表达式只允许 HOME
和 WORK
。
请注意,您的 VCARD 使用已弃用的 VCard 2.1 语法。我建议切换到 VCard 3.0 或 vCard 4.0。
另外请注意,您解析属性的方式还有一些问题。解析较新的 vCard 3.0 或 vCard 4.0 语法时会失败。如果值包含像 \;
这样的转义序列,它也会失败,如果行被折叠,它也会失败(参见 RFC 6350)。