![](/img/trans.png)
[英]How to write regular expression to get the substring from the string using regular expression in 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.