【发布时间】: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 解析器。