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
(另外,愚蠢的坏用户有时会在后面加上难看的空格,有时会在前面加上难看的空格)

天哪,这越来越麻烦了。我最多有三个嵌套函数,但还远远没有完成。我以为这将是一个20分钟的打字练习

这个问题以前已经解决了吗

Visual Studio C#是否已经包含一个只要求用逗号分隔的十六进制字节的属性

我错过了森林里那棵显而易见的树了吗


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