【问题标题】:Validating User Input While Typing using RegEx使用 RegEx 键入时验证用户输入
【发布时间】:2020-03-09 16:57:55
【问题描述】:

我正在努力为以下标准编写 RegEx:

  • 数字可以是正数/负数
  • 可选 - 在开始时
  • 小数点前 1 到 5 个数字之间
  • 只有 2 位小数(可选)
  • 阻止用户输入超过 1 。或 -

这是我尝试实现但对我不起作用的正则表达式。

^((-?[0-9]{1,5}(\.?){1,1}[0-9]{0,2})

它应该允许用户输入以下数字。

-1.12
12345
1
123
12.12

任何帮助将不胜感激!

【问题讨论】:

  • 你有什么理由必须在一个正则表达式中进行所有这些检查吗?
  • 也许^-?\d{1,5}(?:\.\d{0,2})?$ 可以。
  • @WiktorStribiżew 你好 Wiktor,这适用于正数,但不允许我输入负数,我必须先输入正数,然后在开头添加减号。在我添加减号后删除数字时,它会同时删除第一个数字和减号 - 你知道这是为什么吗?
  • 那就试试^-?\d{0,5}(?:\.\d{0,2})?$
  • 是的,或者如果允许后视,则使用^-?\d{0,5}(?:(?<=\d)\.\d{0,2})?$。你可以使用lookbehinds吗?

标签: regex validation decimal user-input negative-number


【解决方案1】:

你可以使用

^-?\d{0,5}(?:(?<=\d)\.\d{0,2})?$

请参阅regex demo

详情

  • ^ - 字符串开头
  • -? - 一个可选的-
  • \d{0,5} - 零到五位数
  • (?:(?&lt;=\d)\.\d{0,2})? - 可选序列
    • (?&lt;=\d) - 当前位置的左边必须有一个数字
    • \. - 一个点
    • \d{0,2} - 零、一位或两位数
  • $ - 字符串结束。

【讨论】:

  • 我不明白为什么向后看会起作用而这不起作用...^-?(?:\d{1,5}(?:\.\d{0,2})?)?$它给出了相同的匹配regex101.com/r/NGztte/1
  • @Thefourthbird 抱歉,我现在无法完全测试它们。我相信您是对的,并且正则表达式是等效的,但是我已经看到了很多场景,我们仍然不知道 OP 使用什么软件。所以,在这种情况下,我只依赖 OP 的反馈。
  • 我只是好奇我可能错过了什么。一切都很好:-)
【解决方案2】:

如果您想在输入时进行验证,您可以使用可选组来接受中间值,并在处理值时对整个模式进行最终检查。

^-?(?:\d{1,5}(?:\.\d{0,2})?)?$

说明

  • ^ 字符串开始
  • -? 可选连字符
  • (?:非捕获组
    • \d{1,5} 匹配 1-45 位数字
    • (?:非捕获组
      • \.\d{0,2} 匹配一个点和 0-2 位数字
    • )? 关闭组并使其成为可选
  • )?关闭组并使其成为可选
  • $字符串结束

Regex demo

要验证最终模式,您可以匹配可选的-、1-5 位数字和可选的小数部分:

^-?\d{1,5}(?:\.\d{1,2})?$

Regex demo

【讨论】:

  • 嗨,请看我对原始问题的评论!
  • @Oliver 不工作吗?你可以输入所有的字符吗?
  • 它不允许我在字符串的开头输入 -!
  • @Oliver 这将允许您在字符串regex101.com/r/NGztte/1 的开头键入- 第一个链接不正确,我已更新。
【解决方案3】:

如果您想匹配以. 结尾的字符串,例如123. demo of this regex,则正则表达式^(-?(\d{1,5}(\.\d{0,2})?)?)$ 应该可以工作

否则,将0 更改为1,如下所示:^(-?(\d{1,5}(\.\d{1,2})?)?)$。然后它只会匹配小数点后有数字的字符串。

您发布的正则表达式允许小数点后超过 2 位的字符串,因为它在 2 位之后停止匹配,即使字符串继续。在正则表达式的末尾添加 $ 会阻止它匹配在我们想要的部分之后继续的字符串。

这个正则表达式 ^(-?\d{1,5}(\.\d{0,2})?)$ 将在用户完成输入后验证输入,因为我假设您不希望 - 在那时有效。

【讨论】:

  • 您好,请看我对原始问题的评论!
  • @Oliver 我更新了我的答案。这个新的正则表达式应该可以完成这项工作。请记住,一旦用户完成输入,您可能不想接受 - 作为有效输入,因此您必须使用另一个正则表达式对其进行验证
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多