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="..." を含むパラメーター全体をキャプチャしたいと思います。

私の質問は次のとおりです。コードを変更できますか、または 2 つのプロセス (古いタイプ用と新しい 4.0 バージョン用の 1 つ。理想的には、両方をサポートしたい) を作成する必要がありますか? (ところで、私は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 に答える