【问题标题】:Regex to accept 15 digits with or without decimal正则表达式接受带或不带小数的 15 位数字
【发布时间】:2021-01-13 18:27:14
【问题描述】:

我有一个已经在系统中使用的正则表达式

/^(?![.,])(?!.*[.,]$)[0-9.,](?!.*[.,]{2}).*$/

我需要验证是否接受 15 位数字。用户可以输入小数,也可以不输入。 我无法理解如何处理这种情况。

我尝试像这样添加限制

/^(?![.,])(?!.*[.,]$)[0-9.,](?!.*[.,]{2}).{1,15}$/

有人可以帮助我了解如何处理小数,并且仍然能够检查是否输入了 15 位数字作为最大长度。超过 15 位应该会引发错误,应该可以接受少于 15 位。

【问题讨论】:

  • 小数点出现在最开始还是最结束可以吗?它应该只出现一次吗?
  • 如果十进制在第一个或最后一个,它应该抛出错误。应该只有 1 位小数。
  • 您是说最大长度为 15 位数字还是最大长度为总共 15 个字符?另外,“只有一位小数”是什么意思,可选的小数点/逗号后应该只有一位吗?

标签: javascript angular regex


【解决方案1】:

您列出的要求的基本答案(最多 15 位数字,最多一位小数,如果适用,至少在小数点前后一位数字)是这样的:

^(?=(?:\d\D*){1,15}$)\d+(?:[.,]\d+)?$

您匹配字符串的完整长度两次:一次以确保您最多有 15 位数字(可能散布非数字),一次以确保您只有数字,并且最多有一个小数点/逗号。

【讨论】:

  • 只是为了让我有更好的理解,哪一部分特别说明你正在对字符串进行两次不同的扫描?第一个分组是否需要括号:(?=...$)
  • (?=...) 是一个积极的前瞻,它确保以下内容应该匹配,但不推进位置(即它是一个零宽度断言)。然后前瞻之外的位再次从同一位置匹配(这一次通常推进位置)。请参阅here 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2012-12-04
  • 2023-03-24
  • 1970-01-01
  • 2017-04-28
  • 2021-11-09
相关资源
最近更新 更多