【发布时间】:2021-07-11 06:09:07
【问题描述】:
我需要对将在我的服务器端使用的值实施正则表达式验证,以获取某些时间戳比now() - interval 'myValue' 更早(更小)的数据。
pSQL区间函数解释here,简而言之它可以有2 days,3 years,12 hours等值,但也可以嵌套更多不同的值,如2 days 6 hours 30 minutes等。
我目前有一个正则表达式/^\d+\s(seconds?|minutes?|hours?|days?|weeks?|months?|years?)$/i,它只接受一个值(例如2 days),但不知道如何允许多个值,并设置一个规则,该组中的某个字符串只能重复一次或一次都没有。
这个正则表达式 /^\d+\s(seconds?|minutes?|hours?|days?|weeks?|months?|years?)(\s\d+\s(seconds?|minutes?|hours?|days?|weeks?|months?|years?))*$/i 允许嵌套,但也允许重复值,例如2 days 12 hours 6 hours 2 minutes 这将导致 pSQL 查询出现致命错误。
我尝试使用 \1 和 {0,1} 正则表达式运算符组合来限制该组中值的重复,但我无法准确地确定它。
注意:不幸的是,正则表达式是我验证此值的唯一方法,因为我无权访问接收此值的服务器端控制器,也无权访问此表单的客户端前端。我不能只是抛出异常或跳过查询,因为它是重要的 cron-job 的一部分,并且必须始终保持稳定。
(我只能访问这个值的 json 模式,因此只能为其定义正则表达式模式)
感谢您的帮助。
【问题讨论】:
-
试试
^(?!$)(?:\d+\s+years?)?(?:(?:\s+|^)\d+\s+months?)?(?:(?:\s+|^)\d+\s+weeks?)?(?:(?:\s+|^)\d+\s+days?)?(?:(?:\s+|^)\d+\s+hours?)?(?:(?:\s+|^)\d+\s+minutes?)?(?:\s+\d+\s+seconds?)?$ -
它适用于
4352 YEARS 2 weeks 4 days 5 days 2 minutes 30 second的情况(两个days值彼此相邻),但当您在较小的值之后插入“较大”值时不允许使用大小写,例如4352 YEARS 2 weeks 4 days 2 minutes 30 second 3 months(请注意,我在末尾插入了几个月,这将在 pSQL 中工作,但这个正则表达式会阻止它) -
那个正则表达式does not allow
4352 YEARS 2 weeks 4 days 5 days 2 minutes 30 second -
是的,我知道。我写了“它有效”,我的意思是它不允许该值:) 但它也不允许它应该允许的
4352 YEARS 2 weeks 4 days 2 minutes 30 second 3 months -
现在完美运行,干得好,非常感谢!您可以将其发布为答案,我将其标记为正确。
标签: regex postgresql