vCard 4.0 Regex - PullRequest
       3

vCard 4.0 Regex

4 голосов
/ 21 ноября 2011

Некоторое время назад я создал программу для обработки файлов vCard. Это можно сделать практически идеально с помощью следующего:

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

Однако это не работает для нового (август 2011 г.) стандарта 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).

Привет.

1 Ответ

2 голосов
/ 27 июня 2012

Попробуйте следующее регулярное выражение:

(?<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 , так что, возможно, я пропускаю некоторые крайние случаи.

...