Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用正则表达式只允许逗号分隔列表中的单个值具有特定长度?_C#_Regex - Fatal编程技术网

C# 如何使用正则表达式只允许逗号分隔列表中的单个值具有特定长度?

C# 如何使用正则表达式只允许逗号分隔列表中的单个值具有特定长度?,c#,regex,C#,Regex,我有一个文本框,我想让用户在逗号分隔的列表中输入十六进制值(不包括0x前缀)。问题是我只希望每个值的长度为四个字符。下面,我使用KeyPress事件处理程序检查用户只能输入一个数字: private void filterIDTextBox_KeyPress(object sender, KeyPressEventArgs e) { if (!Char.IsControl(e.KeyChar) && !Char.IsDigit(e.KeyChar)) {

我有一个文本框,我想让用户在逗号分隔的列表中输入十六进制值(不包括0x前缀)。问题是我只希望每个值的长度为四个字符。下面,我使用KeyPress事件处理程序检查用户只能输入一个数字:

private void filterIDTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!Char.IsControl(e.KeyChar) && !Char.IsDigit(e.KeyChar))
    {
        e.Handled = true;
    }
}
使用正则表达式,我们可以进一步限制用户只允许0-9、A-F、A-F和逗号,如下所示:

private void filterIDTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!Char.IsControl(e.KeyChar) && !Regex.IsMatch(e.KeyChar.ToString(), "[0-9A-Fa-f,]"))
    {
        e.Handled = true;
    }
}
是否有任何方法可以使用正则表达式确保每个逗号之间不超过4个字符?我尝试使用
“[0-9A-Fa-f,]{0:4}”
,但这不起作用,因为我只对字符进行匹配,而不是对文本框的文本进行匹配


有了这个,我确信我将不得不使用除
KeyPress
之外的其他方法,但是我仍然没有成功地编写Regex语句,因为它只允许最多4个字符的值。

首先,您需要验证整个文本,这样才能工作,所以验证
filterIDTextBox.text
加上按下的键。其次,需要一个验证整个字段的正则表达式

private void filterIDTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    string newValueIfAllowed = filterIDTextBox.Text + e.KeyChar.ToString();
    if (!Char.IsControl(e.KeyChar) 
        && (!Regex.IsMatch(e.KeyChar.ToString(), "[0-9A-Fa-f,]")
        || !Regex.IsMatch(newValueIfAllowed , "^([0-9A-Fa-f]{1,4},)*[0-9A-Fa-f]{0,4}$")))
    {
        e.Handled = true;
    }
}
这将允许任何数量的1到4位十六进制值后跟逗号,然后再后跟0到4位十六进制数字。这意味着
123456,
是有效的,但您需要它是有效的,以允许用户键入逗号并继续

另一种方法是在用户输入值并按下某种类型的提交按钮后等待并验证。然后,通过将
{0,4}
更改为
{1,4}
可以将表达式更改为不允许空白值或尾随逗号


注意:这假设用户只在文本框的末尾键入字符,如果他们移动光标,您必须考虑这一点。此外,选择文本并替换它以及复制和粘贴操作也会有问题。

@juharr在哪种情况下最好这样做?Text已更改?您仍然可以使用
KeyPress
,而不是
e.KeyChar.ToString
使用
filterIDTextBox.Text
。您可以提供/描述一个用例吗?@stribizev一个例子是用户输入“123412341123451234”,第三项无效,因为它不应该超过四个字符。您可以使用
^[0-9A-Fa-f]{1,4}(?:,[0-9A-Fa-f]{1,4})+$
regex对整个字符串进行验证。它假设逗号之间的值可以有1到4个符号。看一看,我认为在花括号内使用逗号来表示范围,不是吗?
{1,4}
例如,无论哪种方式,仍然没有成功,但我将尝试找出原因。使用此代码:
如果(!Char.IsControl(e.KeyChar)和&!Regex.IsMatch(e.KeyChar.ToString(),“[0-9A-Fa-f,]”和!Regex.IsMatch(filterIDTextBox.Text),([0-9A-Fa-f]{1,4},)*[0-9A-Fa-f]{0,4})
文本框允许我输入非十六进制字符。我还不确定我缺少了什么。^我认为允许我输入非十六进制字符的原因是因为星号。我删除了星号,但仍然可以输入超过4位的值。是的,它是逗号,而不是破折号。星号本身不应允许您输入任何字符ter.事实上,字符上的第一个正则表达式应该阻止任何非十六进制或逗号字符。虽然我缺少锚。好吧,如果我键入一个“O”,例如,第一个条件为true,第二个条件为true,但第三个条件为false,因此不会被拒绝。也许我的条件错了?是的,如果你愿意的话这三个字符都需要或代替and。我会更新,虽然从技术上讲,您不再需要验证单个字符。