javascript - 使用数字短格式日期模式检测特定的字符串结构
问题描述
我正在努力编写合适的正则表达式来检测包含特定模式(版本号)和短格式日期的字符串。这个字符串来自我正在构建的电子应用程序中的串行端口。
根据响应的硬件,字符串在以下三种模式中,但通常介于两者之间\r\n
,可能还有其他字符串:
MyHardwareName Vn.nn dd/mm/yy
⇒ (MyHardware V1.23 01/02/03)
MyHardwareName Vnn.nn dd/mm/yy
⇒ (MyHardware V12.34 01/02/03)
MyHardwareName Vn.nn dd/mm/yyyy
⇒ (MyHardware V1.23 01/02/2003)
MyHardwareName Vnn.nn dd/mm/yyyy
⇒ (MyHardware V12.34 01/02/2003)
到目前为止,我最接近的方法是仅检测日期并手动处理,然后查找以传输命令开始直到 CRLF 的字符串。这不可靠,有时我会得到下一行的片段。更不用说,.split()
返回多个部分的匹配并不理想。
我的尝试
运行正则表达式的数据响应
hardware -v
...(need to ignore junk here in case there is any)
MyHardware V1.23 01/02/20 (This is the only line I need)
PROCESSOR:xxxxxxxxxx
abc <n> <c> [r]
def <n> <c> [r]
...
正则表达式:
/([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{0,2}/
-> 始终捕获日期之后的行
/(hardware -v\s+)(.*)(\r\n)/
→ 退货:
["hardware -v", "My ", "Hardware V1.10 06/02/15", "
↵PROCESSOR:SAMD51J19A"]
最终,我希望能够使用正则表达式拆分字符串并获得“MyHardware V1.10 06/02/15”(或上述变体之一,其中版本为 2 位,年份为 4 位)。
任何人都可以建议是否可以在一个正则表达式中做到这一点?
解决方案
如果您想匹配 1 次以上的单词字符(或MyHardware
硬编码),后跟一个大写字母V
和一个 1-2 位数字、一个点和 1-2 位数字,后跟一个类似日期的模式,您可以使用:
^\w+(?:[ \t]\w+)*[ \t]+V\d{1,2}\.\d{1,2}[ \t]+(?:3[01]|[12][0-9]|0[1-9])\/(?:1[0-2]|0[1-9])\/(?:20)?[0-9]{2}
解释
^
字符串的开始\w+(?:[ \t]\w+)*
匹配 1+ 次单词 char 与可选的重复部分匹配空格或制表符,再匹配 1+ 次单词 char[ \t]+V
匹配 1+ 次空格或制表符和V
\d{1,2}\.\d{1,2}
匹配 1-2 位数字.
和 1-2 位数字[ \t]+
匹配 1+ 次空格或制表符(?:3[01]|[12][0-9]|0[1-9])\/(?:1[0-2]|0[1-9])\/(?:20)?[0-9]{2}
匹配类似日期的模式
请注意,类似日期的模式不会验证日期本身,如果您不想匹配选项卡,则可以替换为模式[ \t]
中的空格。
const regex = /^\w+(?:[ \t]\w+)*[ \t]+V\d{1,2}\.\d{1,2}[ \t]+(?:3[01]|[12][0-9]|0[1-9])\/(?:1[0-2]|0[1-9])\/(?:20)?[0-9]{2}/gm;
const str = `hardware -v
...(need to ignore junk here in case there is any)
MyHardware V1.23 01/02/20 (This is the only line I need)
PROCESSOR:xxxxxxxxxx
abc <n> <c> [r]
def <n> <c> [r]
MyHardware V1.23 01/02/03
MyHardware V12.34 01/02/03
MyHardware V1.23 01/02/2003
MyHardware V12.34 01/02/2003
My Hardware V1.23 01/02/20`;
console.log(str.match(regex));
推荐阅读
- javascript - 如何使用多个 jquery 代码填充 html 输入/文本字段
- jquery - 如何通过使用 SystemJS 作为模块加载器将 jquery 与 TypeScript 一起使用(ReferenceError:jQuery 未在 Object.execute 中定义)
- firebase - Firebase 身份验证在 1 小时后过期
- c - C:为什么会出现这种分段错误?
- c++ - Konfig32.exe 中 0x6D3800C8 处未处理的异常:使用 MS Detours 后出现 0xC000041D
- angular - 过滤分页外部 api 的所有页面中的数据
- amazon-web-services - 使用 cloudformation yaml 在 Lambda 函数上添加 S3 触发器
- google-apps-script - 在特定时间用于细胞保护的 Google 脚本
- sharepoint - SPFx - 通过主页上的代码配置 Web 部件会删除其他内容
- node.js - 从 Typescript 生成的导入 Node.js 模块的“默认”部分是什么?