我的用户将在这样的地方输入一些字节。
黄色箭头指向他的输入,橙色箭头指向我的按钮
大约半小时后,我开始意识到这比我预期的要繁琐得多。
问题:我是否需要编写数百行代码以确保用户遵守规则?
他输入的语法规则是......
这三条规则可以像用户想要的那样重复。对于接收的字节,还有两个要处理的规则...
我必须检查
?
和*
以下是一些例子..
(首先编辑和更新,所有用户都不是相同的;语法检查器必须处理此 ...)
来自智能优质用户的良好正常格式化输入......
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
( p.s。,愚蠢的坏用户有时会放入丑陋的尾随空格,有时会出现丑陋的前导空格)
好悲伤,这变得毛茸茸。我最多有三个嵌套函数,而且我已经接近完成了。我以为这将是一个20分钟的打字练习。
这个问题以前是否已经解决了?
Visual Studio C#是否已包含仅要求以逗号分隔的十六进制字节的属性?
我是否想念森林中那棵明显的树?
StackOverflow上自动建议的类似问题并没有真正回答这个问题,这让我感到惊讶。当然,我不是第一个遇到这种烦恼的人。建议欢迎
答案 0 :(得分:5)
您可以使用正则表达式来执行此操作:
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}$
答案 1 :(得分:1)
如果您正在寻找非正则表达式解决方案,可以使用此方法。正则表达式非常强大。如果你开始编程,也许这不是最好的方法。正则表达式在拍摄后可能是一团糟。用你想要的东西,玩得开心。
警告!这个片段不检查外卡。我不知道你想做什么'?'和'*'。
您可以在此Fiddle中尝试我的代码。
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;
}
}
Just read @ CPU-Terminator在考虑与我相同的解决方案。