QML 中日期和时间的正则表达式(DD/MM/YYYY hh:mm:ss)

2024-02-15

在QML2中我没有找到任何Calender控件,我已经实现了一个以日期和时间作为输入的控件,并且我使用正则表达式进行验证,该验证与日期(包括闰年和其他验证)相匹配。

主要问题是空格/退格键也应该被视为有效,例如:

\s\s/\s\s/\s\s \s\s:\s\s:\s\s

以下是代码:

TextField{
    id:textEditDate

    width:parent.width * 0.50
    height:parent.height
    text : "01/01/2017 00:00:00"

    inputMask: "99/99/9999 99:99:99"

    validator: RegExpValidator { regExp: /^(((([0\s][1-9\s]|[1\s][0-9\s]|[2\s][0-8\s])[\/]([0\s][1-9\s]|[1\s][012\s]))|((29|30|31)[\/]([0\s][13578\s]|[1\s][02\s]))|((29|30)[\/]([0\s][4,6,9]|11)))[\/]([19\s[2-9\s][0-9\s])\d\d|(^29[\/]02[\/]([19\s]|[2-9\s][0-9\s])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)))\s([0-1\s]?[0-9\s]|2[0-3\s]):([0-5\s][0-9\s]):([0-5\s][0-9\s])$/}

    horizontalAlignment: Text.AlignHCenter
    inputMethodHints: Qt.ImhDigitsOnly
}

现在,除了年份之外,一切都运行良好,我无法匹配年份的退格/空格,并且用户无法清除年份。

您能建议如何实现这一目标吗?或者有没有其他方法可以做到这一点。


Answer

Brief

所以我决定制作一个非常好的正则表达式,它实际上可以在闰年正常工作!然后我添加了您所需的其余逻辑,瞧,真是太美了!


Code

请参阅此处使用的正则表达式 https://regex101.com/r/bnUaF8/2

(?(DEFINE)
  (?# Date )
    (?# Day ranges )
    (?<d_day28>0[1-9]|1\d|2[0-8])
    (?<d_day29>0[1-9]|1\d|2\d)
    (?<d_day30>0[1-9]|1\d|2\d|30)
    (?<d_day31>0[1-9]|1\d|2\d|3[01])
    (?# Month specifications )
    (?<d_month28>02)
    (?<d_month29>02)
    (?<d_month30>0[469]|11)
    (?<d_month31>0[13578]|1[02])
    (?# Year specifications )
    (?<d_year>\d+)
    (?<d_yearLeap>(?:\d*?(?:(?:(?!00)[02468][048]|[13579][26])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D))
    (?# Valid date formats )
    (?<d_format>
      (?&d_day28)\/(?&d_month28)\/(?&d_year)|
      (?&d_day29)\/(?&d_month29)\/(?&d_yearLeap)|
      (?&d_day30)\/(?&d_month30)\/(?&d_year)|
      (?&d_day31)\/(?&d_month31)\/(?&d_year)
    )

  (?# Time )
    (?# Time properties )
    (?<t_period12>(?i)[ap]m|[ap]\.m\.(?-i))
    (?# Hours )
    (?<t_hours12>0\d|1[01])
    (?<t_hours24>[01]\d|2[0-3])
    (?# Minutes )
    (?<t_minutes>[0-5]\d)
    (?# Seconds )
    (?<t_seconds>[0-5]\d)
    (?# Milliseconds )
    (?<t_milliseconds>\d{3})
    (?# Valid time formats )
    (?<t_format>
      (?&t_hours12):(?&t_minutes):(?&t_seconds)(?:\.(?&t_milliseconds))?\ ?(?&t_period12)|
      (?&t_hours24):(?&t_minutes):(?&t_seconds)(?:\.(?&t_milliseconds))?
    )

  (?# Datetime )
    (?<dt_format>(?&d_format)\ (?&t_format))
)
\b(?&dt_format)\b

或者在一行...

请参阅此处使用的正则表达式 https://regex101.com/r/ZDifJ1/1

\b(?:(?:0[1-9]|1\d|2[0-8])\/(?:02)\/(?:\d+)|(?:0[1-9]|1\d|2\d)\/(?:02)\/(?:(?:\d*?(?:(?:(?!00)[02468][048]|[13579][26])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D))|(?:0[1-9]|1\d|2\d|30)\/(?:0[469]|11)\/(?:\d+)|(?:0[1-9]|1\d|2\d|3[01])\/(?:0[13578]|1[02])\/(?:\d+))\ (?:(?:0\d|1[01]):(?:[0-5]\d):(?:[0-5]\d)(?:\.(?:\d{3}))?\ ?(?:(?i)[ap]m|[ap]\.m\.(?-i))|(?:[01]\d|2[0-3]):(?:[0-5]\d):(?:[0-5]\d)(?:\.(?:\d{3}))?)\b

解释

我将解释第一个版本,因为第二个版本只是它的精简版本。请注意,可以轻松更改正则表达式以适应更多格式(仅接受一种稍有变化的格式,但这是一个非常可定制的正则表达式)。

  • d_days28:匹配任意数字01 to 28
  • d_days29:匹配任意数字01 to 29
  • d_days30:匹配任意数字01 to 30
  • d_days31:匹配任意数字01 to 31
  • d_month28:匹配可能只有的月份28天(二月 - 因此02)
  • d_month29:匹配可能只有的月份29天(二月 - 因此02)
  • d_month30:匹配仅具有的月份30天(四月、六月、九月、十一月 - 因此04, 06, 09, 11)
  • d_month31:匹配仅具有的月份31天(一月、三月、五月、七月、八月、十月、十二月 - 因此01, 03, 05, 07, 08, 10, 12)
  • d_year:匹配任何年份(必须至少有一位数字\d)
  • d_yearLeap: I'll break this into multiple segments for better clarity
    • \d*?
      • 匹配任意数量的数字,但尽可能少
    • Match one of the following
      • (?:(?:(?!00)[02468][048]|[13579][26])|(?:(?:[02468][048]|[13579][26])00))- 匹配以下一项
      • (?:(?!00)[02468][048]|[13579][26]) - Match one of the following
        • One of 02468,后跟其中之一048, 但不是00
        • One of 13579,后跟其中之一26
      • (?:(?:[02468][048]|[13579][26])00) - Match one of the following, followed by 00
        • One of 02468,后跟其中之一048
        • One of 13579,后跟其中之一26
      • [48]00- 匹配400 or 800
      • [48]- 匹配4 or 8
    • (?=\D|\b)- 确保后面的内容是非数字字符\D或单词边界字符\b
  • d_format:这指向之前的组,以确保月份格式正确并符合日/月和日/年(闰年)要求,以便我们可以确保正确的日期验证
  • t_period: This was added in case others needed this for validation purposes
    • 确保期间是am, pm, a.m, p.m或它们各自的大写版本(包括诸如a.M当使用多种情况时)
  • t_hours12:匹配从00 to 11
  • t_hours24:匹配从00 to 23
  • t_分钟:匹配任意分钟00 to 59
  • t_秒:匹配任意秒00 to 59
  • t_毫秒:匹配任意3位数字(000 to 999)
  • t_format:这指向之前的组,以确保时间格式正确。我添加了一个额外的时间设置(以及包括毫秒和时间段的附加内容供其他人使用)
  • dt_格式:要检查的日期时间格式(在您的情况下是date time- 以空格分隔特点)
  • 定义块之后是\b(?&dt_format)\b,它简单地匹配dt_format如上所述,确保它之前和取代的内容是单词边界字符(或没有字符)\b

闰年

为了进一步了解正则表达式的闰年部分......

我假设如下:

  • All years are NOT leap years, unless, the following is true
    • ((年模4 is 0) AND(年模100 is not 0)) OR(年模400 is 0)
    • Source: 闰年计算 https://stackoverflow.com/a/725111/3600709
    • 闰年一直存在(至少从第一年开始)——因为我不想开始假设并做更多的研究。

正则表达式的工作原理是确保:

  1. 所有以以下日期结束的闰年0, 4, 8 are preceded by a 0, 2, 4, 6, 8(所有这些都会导致0模数之后 -> 即24 % 4 = 0)
  2. 所有以以下日期结束的闰年2, 6 are preceded by a 1, 3, 5, 7, 9(所有这些都会导致0模数之后 -> 即32 % 4 = 0)
  3. 所有以以下日期结束的闰年00, 对于 1. 和 2.,被否定((?!00)做这个)
  4. 所有以以下日期结束的闰年00 are preceded by 1. 和 2.(完全一样,因为4 * 100 = 400- 除了最后两位数字之外,不需要更改任何内容)
  5. 添加年份400, 800, 4, 8因为他们不满足上述任何条件


Edits

2017 年 10 月 25 日

谢谢@sln https://stackoverflow.com/users/557597/sln用于输入闰年功能。由于以下中提供的更改,下面的正则表达式执行速度稍快sln对此答案的评论 https://stackoverflow.com/a/46940144/3600709(关于一个单独的问题)。改变了(?:(?!00)[02468][048]|[13579][26]) to (?:0[48]|[13579][26]|[2468][048])在闰年部分。

请参阅此处使用的正则表达式 https://regex101.com/r/bnUaF8/3

(?(DEFINE)
  (?# Date )
    (?# Day ranges )
    (?<d_day28>0[1-9]|1\d|2[0-8])
    (?<d_day29>0[1-9]|1\d|2\d)
    (?<d_day30>0[1-9]|1\d|2\d|30)
    (?<d_day31>0[1-9]|1\d|2\d|3[01])
    (?# Month specifications )
    (?<d_month28>02)
    (?<d_month29>02)
    (?<d_month30>0[469]|11)
    (?<d_month31>0[13578]|1[02])
    (?# Year specifications )
    (?<d_year>\d+)
    (?<d_yearLeap>(?:\d*?(?:(?:0[48]|[13579][26]|[2468][048])|(?:(?:[02468][048]|[13579][26])00))|[48]00|[48])(?=\D|\b))
    (?# Valid date formats )
    (?<d_format>
      (?&d_day28)\/(?&d_month28)\/(?&d_year)|
      (?&d_day29)\/(?&d_month29)\/(?&d_yearLeap)|
      (?&d_day30)\/(?&d_month30)\/(?&d_year)|
      (?&d_day31)\/(?&d_month31)\/(?&d_year)
    )

  (?# Time )
    (?# Time properties )
    (?<t_period12>(?i)[ap]m|[ap]\.m\.(?-i))
    (?# Hours )
    (?<t_hours12>0\d|1[01])
    (?<t_hours24>[01]\d|2[0-3])
    (?# Minutes )
    (?<t_minutes>[0-5]\d)
    (?# Seconds )
    (?<t_seconds>[0-5]\d)
    (?# Milliseconds )
    (?<t_milliseconds>\d{3})
    (?# Valid time formats )
    (?<t_format>
      (?&t_hours12):(?&t_minutes):(?&t_seconds)(?:\.(?&t_milliseconds))?\ ?(?&t_period12)|
      (?&t_hours24):(?&t_minutes):(?&t_seconds)(?:\.(?&t_milliseconds))?
    )

  (?# Datetime )
    (?<dt_format>(?&d_format)\ (?&t_format))
)
\b(?&dt_format)\b
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML 中日期和时间的正则表达式(DD/MM/YYYY hh:mm:ss) 的相关文章

随机推荐

  • CloudFormation 不断为我的 S3 存储桶模板的部署抛出 InvalidBucketAclWithBlockPublicAccessError

    Goal 创建一个 S3 存储桶 我的服务将向其中写入图像 并且任何人都可以从中读取图像 因为我将在我的服务的网页上显示该图像 Problem 因此 我有一个非常通用的 我认为 S3 存储桶模板 它应该允许任何人读取其中的对象 SomeS3
  • 使弹性项目包裹在列方向容器中

    因此 要使用行布局将元素包装在 Flex div 中 我所要做的就是 div display flex flex direction row I want to change this to column flex wrap wrap wr
  • HyperSQL (HSQLDB):海量插入性能

    我有一个应用程序 必须将大约 1300 万行 大约 10 个平均长度的字符串插入到嵌入式 HSQLDB 中 我一直在调整一些东西 批量大小 单线程 多线程 缓存 非缓存表 MVCC 事务 log size 无日志 定期调用checkpoin
  • 下拉菜单/文本字段合二为一

    我正在构建新网站 我需要一个下拉菜单来选择网站中的内容数量 但同时我需要这个下拉列表来接受文本 因此 如果客户想从下拉列表中进行选择 那么他可以 如果客户想通过文本输入金额 那么他也可以 正如你所看到的 我想把它变成双重的 例如 假设有一个
  • Java 泛型不兼容类型(不存在类型变量 T 的实例)

    这基本上是我第一次接触 Java 泛型类型 我无法弄清楚下面的代码有什么问题 我有一个助手类Helper具有静态函数inRange使用泛型类型应该从输入列表中返回特定对象的列表range围绕索引处的对象index 我还没有测试过 如果它工作
  • 如何在 WordPress 中加载 Ajax

    我熟悉以 jQuery 的普通方式使用 ajax 我已经玩了一段时间了 但不明白 WordPress 需要什么才能让它工作 我这里的内容取自一些教程或文章 这是在函数 php 在儿童主题中 code to load jquery worki
  • 如何在 Moderngl EGL 后端启用抗锯齿功能?

    当没有抗锯齿时 此代码呈现一个彩色三角形 samples 0 但是当我打开抗锯齿功能时 samples 1 32 它无法渲染任何东西 如何使其与抗锯齿一起使用 也许我无法直接从多重采样 fbos 或纹理中读取像素 但我不知道如何解决这个问题
  • jQuery Mobile“pagebeforechange”被调用两次

    我为 pagebeforechange 设置了以下侦听器 与 jQuery Mobile 文档自己的代码非常相似 并且在主页上有一个正在调用的链接http localhost product id 255979 http localhost
  • ASP.Net core 中全大写属性名称默认驼峰命名法序列化为 JSON 的问题

    我对 Net Core 的默认序列化 CamelCasing 行为有疑问 希望看看其他人是否也遇到同样的问题以及他们使用了什么解决方法 像 FOO12 或 FOO1 这样的属性名称被错误地序列化为类似 foO12 或 foO1 事实上 它们
  • 您的 InputStream 既不是 OLE2 流,也不是 OOXML 流

    我正在使用 Apache Commons 在 Google 应用程序引擎中上传 docx 文件 如本链接中所述文件上传 Servlet https developers google com appengine kb java csw 1
  • 在 Docker 中使用卷访问容器文件系统

    我是 Docker 的新手 正在尝试让卷正常工作 但有些事情不太正确 我已经在 Docker 上安装了 Wordpress 如 Docker 教程中所述 https docs docker com compose wordpress htt
  • 从包类型扩展命名空间

    我在这里尝试从包类型扩展命名空间 typings fullcalendar
  • Git 推送和弹出?即,结帐最后状态

    我正在编写一个 Bash 脚本 我想签出一个标签 然后签回到我开始的地方 I tried git co HEAD 1 但是当从 master 开始时 这会让我回到 master 的提交 SHA 但头是分离的 有没有类似的东西pushd po
  • 有没有办法安装 jar 本地 gradle 存储库,就像在 mave 中一样(maven install:install-file [重复]

    这个问题在这里已经有答案了 我以前只使用 maven 当项目需要一些在任何存储库中都没有的 jar 时 我可以使用以下命令安装它 mvn install install file Dfile
  • WIX 错误 - ICE03:不是有效的外键

    目前使用 WIX v3 6 3303 开发安装程序项目 我们正在使用 CruiseControl 在发布前自动构建和测试各种更改 这是我们从测试构建中返回的错误 errorLGHT0204 ICE03 Not a valid foreign
  • PyQt 的优雅命令行参数解析

    我正在编写一个新的 PyQt 应用程序 我正在尝试使用尽可能多的 PyQt API 来完成与程序和 ui 相关的所有事情 作为提高我对 PyQt 和 Qt 总体知识的一种手段 我的问题是 PyQt Qt 中是否有 API 可以优雅地处理命令
  • 在开发过程中绕过或关闭 [Authorize(Roles="")]?

    构建 MVC3 应用程序 TPTB 希望我们使用他们的自定义授权提供程序 然而 在开发过程中 这个身份验证提供程序有点麻烦 因为它要么在您关闭 重新启动浏览器之前给出错误 要么要求您在每次编译时重新登录 现在 我只是添加了
  • 查询范围不等于0

    我在 AX 2012 R2 环境中 我想向 HcmEmployment 表添加查询范围并过滤掉 LegalEntity 值 0 的行 以下代码在运行时失败 并出现 无效范围 异常 qbrLegalEntity qbds addRange f
  • 引用列的统计信息是否会阻止删除该列?

    我正在尝试一个非常简单的drop column陈述 alter table MyTable drop column MyColumn 并收到几个错误 消息 5074 16 级 状态 1 第 1 行统计信息 dta stat 12682516
  • QML 中日期和时间的正则表达式(DD/MM/YYYY hh:mm:ss)

    在QML2中我没有找到任何Calender控件 我已经实现了一个以日期和时间作为输入的控件 并且我使用正则表达式进行验证 该验证与日期 包括闰年和其他验证 相匹配 主要问题是空格 退格键也应该被视为有效 例如 s s s s s s s s