前一段时间,我创建了一个程序来处理 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)。
问候。
最佳答案
试试下面的正则表达式:
(?<FIELD>[^\s:;]+)(;(?<PARAM>[^=:;]+)=\"?(?<VALUE>[^:;]+)\"?)*:(?<CONTENT>[^;]*;?)*
该查询似乎同时处理提供的 vCard 3.0 示例 here :
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 规范中的这个例子 here :
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 的同时查看了示例。所以我可能遗漏了一些边缘情况。
关于c# - vCard 4.0 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8216357/