簡體   English   中英

如何在C#中使用正則表達式編寫正則表達式以驗證字符串

[英]how to write regular expression to validate a string using regex in C#

我需要根據條件驗證用戶輸入。 我寫了一個正則表達式來做到這一點,但是並不確定為什么。 有人可以指出我犯錯的地方嗎?

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無效

我會寫:

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

您似乎不需要{2}來驗證像P0707這樣的字符串

您的正則表達式^[PTQA](?:(?:0|8)[01234567]){2}$

適用於以下內容:

P8001
P8002
P0281
P8005

依此類推,因為您要重復數字匹配項{2}

要驗證類似P81 / P05的內容,您需要將其更改為{1}

您可以將您的正則表達式簡化為^[PTQA](?:(?:0|8)[0-7])$

如果您需要速度正則表達式的速度不是很快,通常可以通過切換案例來實現對靜態值的簡單查找。 當涉及到可維護性時,它們並不是很好,但是如果這些值相當穩定並且僅在這一地方使用,就不會太在意。 如果是,則可以使用所有有效值的HashSet。

使用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;
}

如果您在列表中排序可能的十六進制數字,則可以像這樣自動構建正則表達式

var hexs = new List {"00", "80", "01", "81", "02"};
var regex = string.Format("^[PTQA]({0})", string.Join("|", hexs));
var accuracyCodeHexRegex = new Regex(regex);

如果知道了可能的值,為什么不將這個已知的可能值的數組與之比較?

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);
}

這比使用正則表達式簡單得多,我相信性能要高得多

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM