C# 验证用户输入
我的用户将在这样的位置输入一些字节 黄色箭头指向他的输入,橙色箭头指向我的按钮 大约半个小时后,我开始意识到这比我想象的要乏味得多 问题:我是否需要编写数百行代码来确保用户遵守规则 他输入的语法规则是C# 验证用户输入,c#,text,textbox,verify,C#,Text,Textbox,Verify,我的用户将在这样的位置输入一些字节 黄色箭头指向他的输入,橙色箭头指向我的按钮 大约半个小时后,我开始意识到这比我想象的要乏味得多 问题:我是否需要编写数百行代码来确保用户遵守规则 他输入的语法规则是 十六进制字节 然后是逗号 然后是空白(可能,由他选择) 这三条规则可以根据用户的需要重复。对于接收的字节,还有两个规则需要处理 星号:匹配任意字节数的通配符 问号:匹配任何单个字节的通配符 我得检查一下 有效字符(0-9,A-F,上/下) 两个通配符?和* 逗号的正确位置 没有双逗号
- 十六进制字节
- 然后是逗号
- 然后是空白(可能,由他选择)
- 星号:匹配任意字节数的通配符
- 问号:匹配任何单个字节的通配符
- 有效字符(0-9,A-F,上/下)
- 两个通配符
和?
*
- 逗号的正确位置
- 没有双逗号
- 适当的空白(例如,数字之间无空白)
- 异常空白(例如,他可以在逗号后加零、一或多个空格)
- 表示字节的可能单个字符(例如,“0”而不是“00”)
01、FF、3E、27、7F
55,EE,01,00
21、FE、2B、00、1F
37、*、18、、00、37
81、*、00、*、FF、91、、11、、FF
20,31,7F,28,*,FF
47 4F、20、50、4F、4D、45、、21
1,ff,3e,27,7f
55,EE,1,00
21、Fe、2b、0、1f
37、*、18、、00,37
81、*、0、*、Ff、91、、11、、Ff
20,31,7f,28,*,FF
47,4F,20,50,4F,4D,45,21
StackOverflow上自动提出的类似问题并没有真正回答这个问题,这让我感到惊讶。当然,我不是第一个遇到这种麻烦的人。欢迎您的建议您可以使用正则表达式来实现这一点:
String input = "01, FF, 3E, 27, 7F";
String pattern = @"^([0-9A-F]{2},\s?)*[0-9A-F]{2}$";
bool matches = Regex.IsMatch(input, pattern);
正则表达式是^([0-9A-F]{2},\s?*[0-9A-F]{2}$
,这是
^-开始[0-9A-F]-十六进制字符集
{2} -该集合的两个字符
,-只有逗号
\s?-可选空间
*-重复0次或更多次 注意:如果要在逗号后加空格,请使用
^([0-9A-F]{2}\s)*[0-9A-F]{2}$
注2:如果只允许一个字符并允许小写字母,请使用
^([0-9A-Fa-f]{1,2}\s)*[0-9A-Fa-f]{1,2}$
如果要寻找非正则表达式解决方案,可以使用此选项。正则表达式非常强大。如果你开始编程,也许这不是最好的方法。正则表达式在拍摄后读起来会很混乱。使用你想要的,并享受乐趣
警告!此代码段不检查通配符。我不知道你想用“?”和“*”做什么
你可以在这里试试我的代码
使用系统;
公共课程
{
公共静态void Main()
{
bool b=checkValue(“01,FF,3E,27,7F”);//textBox.Text
控制台写入线(b);
}
静态布尔校验值(字符串s)
{
string[]tab=s.Split(新字符串[]{,“},StringSplitOptions.None);//以“,”作为分隔符拆分字符串
foreach(选项卡中的var hex)
{
if(hex.Length!=2)//检查是否有两个值
返回false;
foreach(十六进制变量c)
{
//检查有效字母(上下)和数字
如果(!((c>='0'&&c='a'&&c='a'&&c),则称为验证。您可以“简化”如果你知道正则表达式,可以使用正则表达式。你可以从将键入的输入限制为有效字符开始。@RobertHarvey这对我来说是一个新短语。值得花教育时间来学习它吗?如果你的问题是你必须在奇怪的地方编写大量的命令式验证代码,那么这将是制作代表你的数据(如果你还没有),并将你的验证逻辑移动到这些类中。这样验证你的数据就隐含在修改或创建你的数据中。看起来你要验证的工作太多了,正则表达式绝对值得学习(而且不是那么难)。我建议:刚找到这个地方,我应该从这里开始学习吗?不知道你是怎么做的,但我会这么做:1)去掉所有空格,反正它们都是不必要的。2)将字符串拆分成一个数组,用逗号分隔。3)迭代数组以检查所有字符是否可解析为十六进制数。您可以将通配符检查与十六进制可解析性检查一起进行。我是否遗漏了什么?或者是否遗漏了什么?@Asad True,以不同的方式更改了这一点(不太紧凑,但可能更容易理解).@Asad不确定需要什么,所以在答案中添加了一个注释。@Asad是的,是(脸红)。谢谢你的帮助。好的,看我的第二个注释。不知道你只允许小写和一个字符。好的,所以我观察到(1)尾随空格和(2)额外的嵌入空格不匹配。我接近这个了吗
using System;
public class Program
{
public static void Main()
{
bool b = checkValue("01, FF, 3E, 27, 7F"); // textBox.Text
Console.WriteLine(b);
}
static bool checkValue(string s)
{
string[] tab = s.Split(new string[] { ", " }, StringSplitOptions.None ); // split string with ", " as a delimiter
foreach (var hex in tab)
{
if (hex.Length != 2) // Check if we have two values
return false;
foreach(var c in hex)
{
// check for valid letter (upper and lower) and digit
if(!((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F')))
return false;
}
}
return true;
}
}