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 }

例如: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])$这将为您解决问题

如果您需要速度,正则表达式并不是非常快,并且通常可以使用 switch-case 来实现对静态值的简单查找。就可维护性而言,它们并不是那么好,但如果这些值相当稳定并且只在这个地方使用,那么就不应该太担心。如果是,您可以使用所有有效值的 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

如果您对列表中可能的十六进制数字进行排序,您可以像这样自动构建正则表达式

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 回答