0

条件に基づいてユーザー入力を検証する必要があります。そのために正規表現を書きましたが、理由がわかりません。誰かが私が間違いを犯している場所を指摘できますか?

Regex AccuracyCodeHexRegex = new Regex(@"^[PTQA]((0|8)[01234567]){2}$");

これは私が検証しようとしているものです(文字列がこれらの文字列のサブセットである場合、それは有効です):

Phh、Thh、Qhh、Ahh 'h' はセット {00, 80, 01, 81, 02, 82, 03, 83, 04, 84, 05, 85, 06, 86, 07, 87 の 16 進数です。 }

例: P00 は有効です P20 は無効です

4

5 に答える 5

2

私は書くだろう:

^[PTQA]((0|8)[0-7])$

{2}次のような文字列を検証する必要はないようですP0707

于 2012-12-06T10:51:03.103 に答える
2

あなたの正規表現^[PTQA](?:(?:0|8)[01234567]){2}$

以下に適用されます。

P8001
P8002
P0281
P8005

など、数の一致を繰り返しているためです{2}

P81 / P05 のようなものを検証するには、それを次のように変更する必要があります。{1}

于 2012-12-06T10:51:12.723 に答える
2

正規表現を単純化^[PTQA](?:(?:0|8)[0-7])$して、トリックを実行できます

速度が必要な場合、正規表現はそれほど高速ではなく、通常、静的値の単純な検索はスイッチケースで実装できます。保守性に関してはそれほど良くありませんが、値がかなり安定していて、この 1 つの場所でのみ使用される場合は、それほど心配する必要はありません。そうであれば、すべての有効な値の HashSet を使用できます。

ハッシュセットの使用:

var leading = new[]{'P','T','Q','A'};
var firstDigit = new []{'0','8'};
var lastDigit = new []{'0','1','2','3','4','5','6','7'};

var set = new HashSet<string>(from l in leading
                              from f in firstDigit
                              from lst in lastDigit
                              select l + f + lst);

public bool IsOk(string value){
   return set.Contains(value);
}

またはスイッチケースを使用:

public bool IsOk(string value){
   if(value.length != 3) return false;
   switch(value[0]){
       case 'P':
       case 'T':
       case 'Q':
       case 'A':
          switch(value[1]){
               case '0':
               case '8':
                   switch(value[2]){
                        case '0':
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                            return true;
                   }
         }

   }
   return false;
}
于 2012-12-06T11:20:35.110 に答える
0

リスト内の可能な16進数をソートすると、次のように正規表現を自動的に構築できます

var hexs = new List {"00", "80", "01", "81", "02"};
var regex = string.Format("^[PTQA]({0})", string.Join("|", hexs));
var accuracyCodeHexRegex = new Regex(regex);
于 2012-12-06T10:49:42.460 に答える
0

可能な値がわかっている場合、この既知の可能な値の配列と比較してみませんか?

void Foo(){

    var valueToTest1 = "P07";
    var valueToText2 = "Z54";

    TestValue(valueToTest1);
    TestValue(valueToTest1);
}

bool TestValue(string stringToTest)
{
    var hexValues = new string[] { "00", "80", "01", "81", "02", "82", "03", "83", "04", "84", "05", "85", "06", "86", "07", "87"};
    var leftValues = new char[] { 'P', 'Q', 'H' };

    var left = stringToTest[0];
    var right = strintToTest.SubString(1,2);

    return leftValues.Contains(left) && hexValues.Contains(right);
}

これは正規表現を使用するよりもはるかに簡単で、はるかにパフォーマンスが高いと思います

于 2012-12-06T10:50:02.790 に答える