![](/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.