使用数字短格式日期模式检测特定字符串结构

Detect specific string structure with numeric shortform date pattern

我正在努力编写一个合适的正则表达式来检测包含特定模式(版本号)和短格式日期的字符串。此字符串来自我正在构建的 Electron 应用程序中的串行端口。

根据响应的硬件,该字符串具有以下三种模式,但通常介于 \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() returns 多段匹配并不理想。

我的尝试

对 运行 正则表达式的数据响应

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)/ → Returns:

["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}

Regex demo

说明

  • ^ 字符串开头
  • \w+(?:[ \t]\w+)* 匹配 1 次以上的单词 char 和匹配 space 或制表符的可选重复部分,然后再次匹配 1 次以上的单词 char
  • [ \t]+V 匹配 1+ 次 space 或制表符和 V
  • \d{1,2}\.\d{1,2}匹配1-2位数字,.和1-2位数字
  • [ \t]+ 匹配 1+ 次 space 或制表符
  • (?:3[01]|[12][0-9]|0[1-9])\/(?:1[0-2]|0[1-9])\/(?:20)?[0-9]{2} 匹配类似模式的日期

请注意,类似日期的模式本身不会验证日期,如果您不想匹配制表符,可以将 pattern 中的 [ \t] 替换为 space ].

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));

Regex1

/(^[a-zA-Z]+)\s+(V[\d\.]+)\s+(\d+)\/(\d+)\/(\d+)/img

结果

MyHardware V1.23 01/02/03

MyHardware V12.34 01/02/03

MyHardware V1.23 01/02/2003

MyHardware V12.34 01/02/2003

Regex2

(.*)(\d\d)(\d\d)$     find

                  replace

结果

MyHardware V1.23 01/02/03

MyHardware V12.34 01/02/03

MyHardware V1.23 01/02/03

MyHardware V12.34 01/02/03