2016-06-15 25 views
0

私は複雑すぎる(私にとってはあまりにも経験がないので)文字列比較ロジックの助けが必要です。基本的には、文字列を検証してフォーマットルールと一致することを確認したいと思います。 .NET 4.5.2を対象としたC#を使用しています。私は私をこのように文字列の期待される形式を与えるAPIで動作するようにしようとしています複雑な文字列比較ロジック

1:420 + 4:9 ####(「420」の位置に始めている必要があります1 ANDは位置4に "9"を持ち、位置5-8に数字を有する。

2:Z + 14:& & +20:10,11,12(位置2に "Z"を持たなければならない。位置14,15のアルファベット文字は、位置20から始まる「10」、「11」、または「12」のいずれかを持ちます。

凡例:

":" =位置/ VALUELIST分離

"" =値セパレータ

"+" =試験セパレータ

"#" =数字桁のみワイルドカード

このことを考えると

"&" =アルファ文字だけのワイルドカード

、私のモミstの考えは、入力文字列の一連の部分文字列と分割を行い、各セクションで比較を行うことです。あるいは、forループを実行して、入力文字列の長さの終わりに達するまで、各文字を1つずつ繰り返します。

この場合、入力文字列は「420987435744585」のようなものとします。最初の3つは420、4の位置は9、そして次の5〜8は数値なので、ルール番号1を使用して、これをパスする必要があります。

これまでは、検証をパス/フェイルするとboolを返すメソッドを作成しました。入力された文字列が渡されます。次に、+と - を分割して、すべてのandセクションを取得し、コンマで分割してルールグループを取得します。しかし、これは私が立ち往生している場所です。それは容易でなければならないかもしれないと思われるかもしれませんが、私はちょうどその周りに私の頭を包むように見えることができないと私は配列のトン、foreachループ、if文などで終わるつもりだと思っています...入力文字列が自分の書式と一致する場合、真偽を検証して返します。

誰か助けて助けてください。

ありがとうございます!

+0

正規表現を使用できますか? – vmg

+0

はい、私は正規表現を使用することができます。私はこれらの行に沿って以下の応答を見る。 –

答えて

0

私は最善の方法は、カスタムだと思いますそれはRegExよりも速く、tを変換する手作業がたくさんあります帽子のフォーマットをRegExに変換します。

私は検証機能を開始しました。あなたが提供したサンプルについては、テストが正常です。

static bool CheckFormat(string formatString, string value) 
{ 
    string[] tests = formatString.Split('+'); 

    foreach(string test in tests) 
    { 
     string[] testElement = test.Split(':'); 
     int startPos = int.Parse(testElement[0]); 
     string patterns = testElement[1]; 

     string[] patternElements = patterns.Split(','); 

     foreach(string patternElement in patternElements) 
     { 

      //value string not long enough, so fail. 
      if(startPos + patternElement.Length > value.Length) 
       return false; 

      for (int i = 0; i < patternElement.Length; i++) 
      { 
       switch(patternElement[i]) 
       { 
        case '#': 
         if (!Char.IsNumber(value[i])) 
          return false; 
         break; 

        case '&': 

         if (!Char.IsLetter(value[i])) 
          return false; 
         break; 

        default: 

         if(patternElement[i] != value[i]) 
          return false; 
         break; 

       } 
      } 
     } 
    } 

    return true; 
} 

あなたはそれを再生したい場合はDOTNETのフィドルはここにある:https://dotnetfiddle.net/52olLQここ

はコードです。

幸運。

+0

ゲーリー、フィードバックとコードサンプルに感謝します。私はそれを見て理解するのに役立つので、とても感謝しています。私はこの明日を振り返り、このスレッドを自分の結果で更新し、他の人が私の実験の恩恵を受けるようにします。 –

1

これらの条件を処理する最も良い方法は、正規表現(正規表現)を使用することです。最初は少し複雑かもしれませんが、すべてのタイプの文字列パターンを簡単な非冗長な方法で処理するための学習に時間を費やすことは価値があります。

あなたはこれらのチュートリアルを開始することができます:

http://www.codeproject.com/Articles/9099/The-Minute-Regex-Tutorial

http://www.tutorialspoint.com/csharp/csharp_regular_expressions.htm

およびリファレンスとして、このいずれかを使用します。

https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx

+0

この返信いただきありがとうございます。私はRegexについて多くのことを見始めているので、私はそれを学ぶべきときだと思うので、リンクと読み物についてもあなたに感謝します。私はこれらのチュートリアルを使って自分自身を教育して、これをオプションとして持っていきます。 –

+0

私の喜び、幸運! – akazemis