我正在努力编写一个合适的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 2003年1月2日)MyHardwareName Vnn.nn dd/mm/yyyy
⇒(MyHardware V12.34 01/02/2003)
到目前为止,我最接近的方法是仅检测日期,然后手动处理并查找从传输的命令开始直至CRLF的字符串。这是不可靠的,有时我会得出下一行的内容。更不用说,.split()
会以多段形式返回匹配项,这并不理想。
我的尝试
数据响应以运行regex
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中这样做吗?
最佳答案
如果您想匹配一个单词字符(或硬编码的MyHardware
),其后加上一个大写的V
和版本号1-2位,点和1-2位,点号和1-2位,再加上日期(例如pattern),则需要匹配1次以上。采用:
^\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匹配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}
匹配日期(如模式)请注意,类似日期的格式不会验证日期本身,并且如果您不希望匹配选项卡,则可以将
[ \t]
替换为pattern中的空格。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 - 使用数字简短日期模式检测特定的字符串结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54840763/