Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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# 如何为Regex.ismatch函数提供正则表达式?_C#_Regex - Fatal编程技术网

C# 如何为Regex.ismatch函数提供正则表达式?

C# 如何为Regex.ismatch函数提供正则表达式?,c#,regex,C#,Regex,我正在尝试编写一个正则表达式来接受长度不超过14的数字,如果它们保留小数点,那么它应该只接受小数点后的2个数字 我已通过以下链接尝试过: 但是,同一个Regex.IsMatch函数不接受以^开头、以$结尾的普通正则表达式 请在这方面帮助我,我对正则表达式不熟悉 private void ChangedSellUp_KeyDown(object sender, KeyEventArgs e) { string pattern = "^[0-9]*$

我正在尝试编写一个正则表达式来接受长度不超过14的数字,如果它们保留小数点,那么它应该只接受小数点后的2个数字

我已通过以下链接尝试过:

但是,同一个Regex.IsMatch函数不接受以^开头、以$结尾的普通正则表达式

请在这方面帮助我,我对正则表达式不熟悉

private void ChangedSellUp_KeyDown(object sender, KeyEventArgs e)
    {            
        string pattern = "^[0-9]*$";            
        Regex rx = new Regex(pattern);
        if (rx.IsMatch(ChangedSellUp.Text))
        {
            e.Handled = true;
        }
    }  
这里ChangedSellup.Text是我的文本框值,我试图根据两个条件限制该值

  • 其应只接受数字,长度不应增加14到小数点
  • 如果小数点在后面,则只允许2个数字
  • e、 g;有效值-14.231234567890134.23 无效值-1.2344、1234567890134.3455


    请帮我处理regex???

    这里是regex.IsMatch,它可以满足您的需要:

    Regex.IsMatch("12345678901234.12", @"^\d{1,14}(?:\.\d{1,2}){0,1}$")
    
    该特定正则表达式用于小数点前14位和小数点后1或2位的数字(整个小数部分是可选的)

    测试它的好地方是:

    因为您提到了^和$,所以我将它们包含在正则表达式中,它将只解析带有数字的行(因此,例如“1234.12”在IsMatch中不会返回true,如果这不重要,只需删除“^”和“$”)

    regex的另一个好资源是:

    更新:

    由于目标是用户只能在文本框中编写满足正则表达式的内容,因此可以在文本更改事件中执行此操作(向下键不是一个好选项,因为您必须将KeyEventArg的键转换为字符)。因此,实现您所需的最简单方法是:

      private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
      {
         if (!Regex.IsMatch(TextBox1.Text, @"^\d{1,14}(?:\.\d{0,2}){0,1}$"))
         {
            TextBox1.Text = TextBox1.Text.Substring(0, TextBox1.Text.Length - e.Changes.Last().AddedLength);
            TextBox1.CaretIndex = TextBox1.Text.Length;
         }
      }
    

    请注意正则表达式中的细微变化,它将接受一个后跟一个点的数字,没有额外的数字,这是因为当您编写一个带小数位数的数字时,您将处于一种发生这种情况的状态,例如:“123”。

    构建正则表达式的最佳方法是使用正则表达式测试仪。有一个非常好的,你可以下载叫做Cappucino的,或者你可以使用网络的,我喜欢

    那么这只是构建正则表达式的一个例子,我正在测试
    12345678901344.00

    如果您以数字的正则表达式模式
    \d
    开始,那么您将获得预期的所有16个匹配项

    添加一个缩写为一个或多个的
    +
    ,以便
    \d+
    匹配两次
    1234567890134
    00

    如果将范围限制为仅两位数,即
    \d{2}
    ,则得到8对数字

    要添加
    您需要转义字符,因为
    是一种匹配任何数字的模式,因此请改用
    \。\d{2}
    仅匹配
    .00
    (这是数字的可选部分)

    如果模式匹配长度介于1和14之间的数字范围
    \d{1,14}
    ,则将匹配
    1234567890134
    (主数字)和
    00

    现在你可以把它放在一起了,我们让小数点后的部分成为可选的,我们想让它0或1次
    {0,1}
    ,或者用一个速记变量
    来给出

    \d{1,14}(\.\d{2})?

    哪一个匹配正确

    12345678901234.00
    123456.00
    1
    1234
    
    因为我不匹配行的开始和结束,所以也匹配这些

    500.00USD
    $1000
    

    请显示导致问题的确切代码,而不是指向其他答案的链接。另外,请告诉我们发生了什么错误?你怎么知道它工作不正常?可能是你的正则表达式不好。你的正则表达式将匹配任何数字序列,无论长度有多长,并且不会匹配其他字符。我已经按照建议进行了匹配,但我的文本框接受偶数字符。当你说你的文本框接受偶数字符时,你的确切意思是什么?您的目标是用户只能键入数字吗?是的,用户应该只能键入具有上述条件的数字,我知道正则表达式是正确的,但regex.ismatch函数不起作用。regex是正确的(ish)正则表达式。我已经更新了答案,以便它反映出你需要达到的目标。不捕获组有什么意义?这个表达式和@“^\d{1,14}(\.\d{2})$”一样,我觉得更容易理解。