在 Django 中使用 RegexValidator 验证数字或数字范围的高性能方法



问题

我有一个模型,它有一个CharField字段,其中该字段只能接受数字或一系列数字。如果数字是十进制且为 <1,则数字必须具有前导零;如果它们是整数,则除非尾随周期具有尾随零,否则它们不能具有尾随句点。范围使用连字符描绘,不得包含任何空格。我正在使用 Django 的RegexValidator来验证该字段。

注意:我不在乎范围是否颠倒(例如6-310.3-0.13(

以下是应在验证器中传递的一些值示例:

  • 5
  • 0.42
  • 5.0
  • 5-6
  • 5-6.0
  • 0.5-6.13
  • 5.1-6.12
  • 13.214-0.1813

这些对于验证器来说应该是无效的值:

  • 5.
  • 5.1.3
  • 5.13.215
  • 5-13.2-14
  • .13-1.31
  • 5-6.
  • 5 - 6

我当前的解决方案

my_field = models.CharField(
...
validators=[
RegexValidator(
r'^[0-9]+([.]{1}[0-9]+){0,1}([-]{1}[0-9]+([.]{0,1}[0-9]+){0,1}){0,1}$',
message='Only numerics or range of numerics are allowed.'
)
]
)

我需要什么帮助

如您所见,这是一个非常粗糙的正则表达式模式,我不确定此模式是否具有性能。我不是正则表达式大师,所以如果有人提供更好的解决方案,我将不胜感激。

我会使用这个正则表达式模式:

^d+(?:.d+)?(?:-d+(?:.d+)?)?$

这说:

d+         match an initial whole number component
(?:.d+)?  followed by an optional decimal component
(?:
-       range separator
d+         second whole number
(?:.d+)?  with optional decimal component
)?          the range being optional

演示

相关内容

  • 没有找到相关文章

最新更新