4

不久前,我创建了一个程序来处理 vCard 文件。这可以通过以下方式几乎完美地完成:

(?<FIELD>[^\s:;]+)(;(?<PARAM>[^:]+))*:(?<CONTENT>.*(?>\r\n[ \t].*)*)$

但是,这不适用于新的(2011 年 8 月)vCard 4.0 标准。问题是 vCard 4.0 文件使用以下布局:

FIELD(:)(;([PARAMETER]="[CONTENT],[MORE CONTENT]"(;))[DATATYPE(:)]:)CONTENT[newline]

例如

ADR;type="home,work":(address)

如您所见,我想捕获整个参数,包括 type="..." 的东西。

所以我的问题是:我的代码是否可以修改,或者我是否必须编写两个进程(一个用于旧类型,一个用于新的 4.0 版本;理想情况下,我希望两者都支持),如果可以,怎么做?(顺便说一下,我使用的是 c# 和 .net 4.0)。

问候。

4

1 回答 1

2

尝试以下正则表达式:

(?<FIELD>[^\s:;]+)(;(?<PARAM>[^=:;]+)=\"?(?<VALUE>[^:;]+)\"?)*:(?<CONTENT>[^;]*;?)*

该查询似乎可以处理此处提供的 vCard 3.0 示例:

ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America

和 4.0 的例子:

ADR;TYPE=work;LABEL="42 Plantation St.\nBaytown, LA 30314\nUnited States of America"
 :;;42 Plantation St.;Baytown;LA;30314;United States of America

它还与此处的 vCard 4.0 规范中的此示例相匹配:

ADR;GEO="geo:12.3457,78.910";LABEL="Mr. John Q. Public, Esq.\n
      Mail Drop: TNE QB\n123 Main Street\nAny Town, CA  91921-1234\n
      U.S.A.":;;123 Main Street;Any Town;CA;91921-1234;U.S.A.

我的免责声明是我在 vCard 方面没有任何专业知识,我只是浏览了部分规范并在使用RegExr时查看了示例,因此我可能会遗漏一些边缘情况。

于 2012-06-26T21:25:23.613 回答