你好我有一个小应用程序读取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,但我应该使用正则表达式。
所以任何帮助或建议对你来说都很棒。
答案 0 :(得分:0)
您的正则表达式与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)。