2011-01-02 12 views
0

C#の:正規表現

List<string> KeyList = new List<string>(); 
List<string> ValueList = new List<string>(); 

のような、すなわち「キーリスト」や「ValueListのを」

List<String> l_lstRowData = new List<string> { "Data 1 32:01805043*0FFFFFFF", 
               "Data 3, 20.0e-3", 
               "Data 2, 1.0e-3 172:?:CRC" , 
               "Data 6" 
               }; 

と2つのリストを以下のように私は行データのセットを抱えている

私は2つを入力する必要がありますPattern Matching

を使用してl_lstRowDataからのデータからList<String>そして、ここでは、この

のための私の Patternです

パターンでGroupKEYdataは、整数値が続く」と一致する必要があり、そこに存在する場合:だから最後に2つのList sが

KeyList 

      { "Data 1" } 
      { "Data 3, 20.0e-3" } 
      { "Data 2, 1.0e-3" } 
      { "Data 6" } 



ValueList 

      { "32:01805043*0FFFFFFF" } 
      { "" } 
      { "172:?:CRC" } 
      { "" } 

のscenerioが含まれています

String l_strPattern = @"(?<KEY>(Data|data|DATA)\s[0-9]*[,]?[ ]?[0-9e.-]*)[ \t\r\n]*(?<Value>[0-9A-Za-z:?*!. \t\r\n\-]*)"; 
Regex CompiledPattern=new Regex(l_strPattern,RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); 

コンマ(、)、次の文字列、すなわちdoubleの値

Groupパターン内のは、whitespaceの後の文字列と一致する必要があります。最初の文字列では32:01805043*0FFFFFFFと一致する必要がありますが、3番目の172:?:CRCに一致する必要があります。

は、ここに私のサンプルコード

for (int i = 0; i < l_lstRowData.Count; i++) 
     { 
      MatchCollection M = CompiledPattern.Matches(l_lstRowData[i], 0); 
      KeyList.Add(M[0].Groups["KEY"].Value); 
      ValueList.Add(M[0].Groups["Value"].Value); 

     } 

あるしかし、私のPatternは、このような状況では動作しません。

KeyList 

      { "Data 1 32" } // 32 should be in the next list 
      { "Data 3, 20.0e-3" } 
      { "Data 2, 1.0e-3" } 
      { "Data 6" } 



ValueList 

      { ":01805043*0FFFFFFF" } 
      { "" } 
      { "172:?:CRC" } 
      { "" } 

よう

EDIT

私のコードの結果、私は私のパターンを書き換えるために助けてください。

+0

私は失敗したケースに対してマッチを実行し、パートごとに分割します。 (例えば、「うまくいかない」とはどういう意味ですか?) –

答えて

2

私は単純だと思います正規表現は動作します:フラグも使用すれば、(?<key>data \d(?:, [\d.e-]+)?)(?<value>.*)はあなたのキーと値に一致します。

この結果はRubular example linkにあります。

3

あなたのコードは私のために働くので、うまくいかないものを定義してください。また

:あなたが知っているので

    は^を使用して正規表現を開始し、代わりに、マッチの$
  • 使用regex.Match()()で終了し
  • それだけ
  • 私ドン一度一致しますあなたはIgnorePatternWhitespace
  • を使用する理由」tがあれば\ sの代わりに[\トン\ rを\ n]は
  • を使用し、簡単なコンマの代わりに、[、]、簡単なスペースの代わりに[]
  • を使用してご覧くださいデータ| |あなたはIGNORECASE、データの後、不要指定DATAまたは[A-ZA-Z]

をそして、あなたがこれをクリーンアップする場合は、多分あなたは一人でそれを解決することができます:)

+0

「問題」を見つけるのに少し時間がかかりました。その結果、「:01805043 * 0FFFFFFF」は32(たとえば)「32:01805043 * 0FFFFFFF」となるはずです –

+0

上記のすべての内容に同意してください。また、テストを簡略化するために、Rad正規表現デザイナーなどのツールを使用することをお勧めします。 – AFract