2016-06-15 3 views
0

こんにちは、私はvcardsを読む小さなアプリケーションがあります。奇妙な部分は、アドレスが決して読み取られないということです。私は使用しようとする小さなサンプル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:[email protected];INTERNET:[email protected]:Hugo GmbhTEL;WORK:12345678TEL;FAX;WORK:--342342TEL;CELL:45364321TEL;HOME:028560803TITLE:DeveloperURL;WORK:www.example.deURL:www.hug.atEND:VCARD" 

、これは私がアドレスを使用しようと正規表現です::vCardのから正規表現の文字列

:だからここに私達は行く

@"(\n(?<strElement>(ADR))) (;*(?<strAttr>(HOME|WORK)))* (:(?<strPo>([^;]*))) (;(?<strBlock>([^;]*))) (;(?<strStreet>([^;]*))) (;(?<strCity>([^;]*))) (;(?<strRegion>([^;]*))) (;(?<strPostcode>([^;]*)))(;(?<strNation>[^\n\r]*))"; 

とコードIそれを使用する:例えば

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; 

、ここで組織のために働くの正規表現:

@"(?<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)?)))?"; 

正規表現は常に同じパターンに従いますが、何らかの形でそれは常にそのNullのために働きません。そして私は理由を知りません。私はGoogleとcodeprojectのチュートリアルでそれを試しましたが、これまでのところ運がありませんでした。私は周りに図書館があることを知っているが、私は正規表現のものを使用するはずです。

あなたの時間のために、どんな助けや助言も素晴らしいことです。

+0

私たちがより迅速にお手伝いできるように、コードを最小限に抑えることはできませんでしたか?私はあなたが提供した文字列に対してあなたの正規表現を試してみましたが、それはまったく文字列と一致しませんでした。 –

+1

私はそれを最小限に抑えようとしました。このコードは、多くの場合のswitch文の一部です。 Mabey私はvcardが読み込まれるときに文字列を投稿する必要がありますか?私はちょうどそれを読み取るtextBox1.Text = File.ReadAllText(openFileDialog1.FileName); Mabey私はこのコードを投稿する必要がありますか? – opelhatza

+0

ちょうど文字列、あなたがそれに対して実行する正規表現、一致していないが必要なもの。あなたは単純なvCard - 私は - 入力されていると思います。その下の正規表現は文字列と一致しません。 –

答えて

0

あなたの正規表現はADRプロパティと一致しません。

あなたのADRフィールドは、パラメータ

INTL;PARCEL;WORK 
DOM;PARCEL;HOME 

が含まれています。しかし、あなたの正規表現はHOMEWORKすることができます。

VCARDは廃止予定のVCard 2.1構文を使用しています。 VCard 3.0またはvCard 4.0に切り替えることをお勧めします。

また、プロパティを解析する方法には、もう少し問題があることに注意してください。新しいvCard 3.0構文またはvCard 4.0構文を解析すると失敗します。値に\;のようなエスケープシーケンスが含まれていて、行が折り返された場合は失敗します(RFC 6350参照)。

+0

ありがとうございます。そして、vCardのバージョンについてもう一度感謝します。 DidntがREGEXとvCardで私の最初の試みだったことに気付かなかった。 – opelhatza