【问题标题】:My regex match positive real numbers doesn't work我的正则表达式匹配正实数不起作用
【发布时间】:2018-07-24 22:59:25
【问题描述】:

我正在读取 C# 中的 TextBox,我想确保只允许真正的正值(包括整数)。 即 1、23、23.、23.0、23.42 等。 我使用的正则表达式是:

[0-9]+\\.?[0-9]*

但是 C# 只允许我输入数字,而且我永远不能输入句点。

谢谢

代码:

    private static readonly Regex rgx_onlyPositiveReals = new Regex("[0-9]+\\.?[0-9]*"); 

    private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        e.Handled = !IsSamplingRateAllowed(e.Text);

    }

    private static bool IsSamplingRateAllowed(string text)
    {
        if(rgx_onlyPositiveReals.IsMatch(text))
        {
            if(text.Equals(".") || float.Parse(text) <= 0.0)
            {
                MessageBox.Show("Sampling Rate has to be positive.", "Wrong Sampling Frequency Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
            return true;
        }
        return false;
    }

【问题讨论】:

  • 请以我们可以运行的形式向我们展示实际的源代码。您可能有一些轻微的拼写错误或格式错误。
  • .* 的正则表达式开始,看看是否可行。我怀疑有些东西没有正确连接。你的正则表达式太宽松了,如果有的话,应该允许你的数字,除非我错过了什么。
  • 这给出了相同的结果@zzxyz
  • @TheBosco - 可能你已经在你的剃须刀、js 或其他东西上做了什么,这就是禁止.。或者,为输入事件调用了错误的 C# 函数。
  • 顺便说一句,我认为您可能打算标记 WPF 而不是 ASP.NET。在这种情况下,我建议粘贴声明文本框的 XAML。

标签: c# asp.net regex


【解决方案1】:

从外观上看,这个输入框应该只包含数字而没有其他文本;在这种情况下,我会完全避免使用正则表达式。

鉴于您将正则表达式匹配结果解析为float,尝试将输入直接解析为float 可能更有意义,这具有允许任何有效的正float 的额外好处可以首先解析,它还允许以float.Parse/float.TryParse 支持的任何其他有效格式输入数字,例如科学记数法"1E5" == 100000f 或逗号"1,500" == 1500f(取决于文化),无需任何额外努力。

private static bool IsSamplingRateAllowed(string text)
{
    float number;
    return float.TryParse(text, out number) && number >= 0.0f;
}

除非此数据作为 string 用于某些外部进程,并且对格式有额外限制(这似乎不太可能,如果是这种情况,值得将其包括在问题中),那么如果还没有,我建议将此输入框与任何其他信息分开,并让用户输入数字,并且仅将数字直接输入框中。如果您需要从用户那里收集其他信息,您可以根据需要添加其他输入框和控件(这也可以简化对其他信息的验证)。

【讨论】:

    【解决方案2】:

    Give this a try

    模式是^[0-9]+\.?[0-9]*

    在 C# 中,您可以在字符串前面加上 @,这样更容易阅读正则表达式。结果如下:

    "\\this \\is \\the \\same" == @"\this \is \the \same"

    【讨论】:

    • 没用。我得到相同的结果。我正在尝试考虑哪些其他事情会禁止它发生,但老实说,我对 WPF 还很陌生,所以我没有太多可以改变的地方。
    【解决方案3】:

    你可以简单地使用下面的正则表达式

    ^\d*[.]?\d*$
    

    Demo Fiddle

    【讨论】:

    • 之前要加+号吗?
    • 可选 + 符号会很棒。我想。由 OP 决定。
    • @Gauravsa 正数不需要+符号表示正整数。此外,用户似乎不需要它。如果你想被添加然后去^[+]?\d*[.]?\d*$
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多