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

时间:2019-02-23 10:47:19

标签: javascript regex regex-group

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

根据响应的硬件,字符串具有以下三种模式,但通常介于\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位数字)。

有人可以建议在一个Regex中这样做吗?

2 个答案:

答案 0 :(得分:1)

如果您要匹配一个单词字符(或经过硬编码的MyHardware后加1次,然后加上大写的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+)*将单词char与匹配空格或制表符的可选重复部分匹配1次以上,再将char char匹配重复1+次
  • [ \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}匹配日期(例如模式)

请注意,类似日期的格式不会验证日期本身,如果您不希望与制表符匹配,则可以将pattern中的空格替换为[ \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));

答案 1 :(得分:0)

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 2003年2月2日

MyHardware V12.34 2003年1月2日

Regex2

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

$1$2                  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