【问题标题】:datagridview cell accepts only numbers and some special characterdatagridview 单元格只接受数字和一些特殊字符
【发布时间】:2023-03-07 03:11:01
【问题描述】:

我的要求是在我的datagridview的某些列中只允许数字.,<,-<。示例输入是2.5,1-15.5,>10,@ 987654328@,<75

我正在使用正则表达式来检查模式匹配以下是我的代码

If System.Text.RegularExpressions.Regex.IsMatch(val, "^[\d.-]+$") Then
            Return True
        Else
            Return False
        End If

但这只接受数字,.- 这意味着如果我通过 val="2.5"val="5-10" 则返回 true

所以我的问题是如何为其他符号制作它(>,<

【问题讨论】:

  • 只需将这些符号放在方括号中即可。
  • 当您尝试时,您一定是放错了-,它创建了一个范围。但我现在猜,因为你真的没有把它添加到问题中。目前还不清楚。您必须始终包括您所做的事情,以及为什么/如何失败。添加<> 很简单:"^[<>\d.-]+$"
  • @stribizhev 是的,你说过。错误是我的,"^[<>\d.-]+$" 正在工作
  • @stribizhev 如何处理空格??
  • 您要同时允许所有空格还是只允许 horizo​​ntal 空格?没有换行符?

标签: regex vb.net string-function


【解决方案1】:

要进行结构检查并放松空间,您可以使用以下内容:

^(\s*(?:[-><])?\s*\d+(?:[.]\d+)?)+$

试试regex demo

此也接受:1.5 - 10.3&lt; 10 但拒绝无效&lt; 10.2.1 - .. 之前接受。

更新 只接受单个数字不等式(接受 &lt; 10.2 但拒绝 &gt;10 &lt;5)并在减法中接受最大 2 操作数(接受 1.2 - 3.4 但拒绝 1 -1 - 1)(如 @SebastianProske 所述):

^(\s*[><]\s*\d+([.]\d+)?|\d+([.]\d+)?\s*(-?\s*\d+([.]\d+)?\s*)?)$

Regex Demo

PS:更准确地说,我们可以将所有 \s 替换为 [ \t] 以不接受换行符和其他空白字符。

【讨论】:

  • 这个很适合我的要求
  • 为什么要围绕单个子模式使用第一个非捕获组?将^(\s*[-&gt;&lt;]?\s*\d+(\.\d+)?)+$RegexOptions.ExplicitCapture 一起使用。相同的功能,但更短。要仅匹配水平空格,请将 \s 替换为 \p{Zs}
  • @stribizhev:我有条不紊,所以如果我不提取它们,我将始终放置非捕获序列?:,但在这种情况下你的可读性是正确的,最好将它们删除。
  • 这匹配 &gt;1&gt;1 以及 1-1-1
  • @SebastianProske:我在第一个版本中添加了一个更新以排除这些情况,当然更多的界限会导致更复杂的正则表达式)
【解决方案2】:

你应该使用类似的东西:

If System.Text.RegularExpressions.Regex.IsMatch(val, "^\s*?[<>]?\d+?\s*?[\-]?\s*?\d+?[.]?\s*?\d+?$") Then
   Return True
Else
   Return False
End If

通过这种方式,您可以选择匹配字符串开头的 。

编辑:现在修复了空格。使用像 1-1-1 或 2.2 这样的正则表达式字符串。不匹配。

【讨论】:

  • 你不需要转义&lt;&gt;
  • 你确定吗?如果我不确定,我通常会转义特殊字符。 :)
  • 差不多了,但是如果val="5 - 10"(处理那个空间)呢?
  • 哦,你是对的。抱歉,我在示例中没有看到空格,所以没有考虑这一点。我将编辑我的答案以考虑空格。
  • @LucaMus 你的工作也很糟糕,更不用说空格了,+1
【解决方案3】:

不响应“RegEx”问题,但建议替代。我发现 RegEx 会浪费大量时间(开发、CPU 周期和维护。)这是来自 OAuth 示例的字符串编码器,可以轻松修改它以使用简单字符串作为允许的字符列表来执行您想要的操作.

    Protected Function UrlEncode(ByVal value As String) As String
        Dim result As New StringBuilder()
        For Each symbol As Char In value
            If unreservedChars.IndexOf(symbol) <> -1 Then ' "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"
                result.Append(symbol)
            Else
                result.Append("%" + String.Format("{0:X2}", Convert.ToInt32(symbol)))
            End If
        Next
        Return result.ToString()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多