Определить определенную структуру строки с помощью числового шаблона даты короткого замыкания - PullRequest
0 голосов
/ 23 февраля 2019

Я изо всех сил пытаюсь написать подходящее регулярное выражение для обнаружения строки, которая включает в себя определенный шаблон (номер версии) и краткую дату формы.Эта строка взята из Serialport в приложении 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.2301/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 цифры).

Кто-нибудь может посоветовать, возможно ли это сделать в одном регулярном выражении?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

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

$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

0 голосов
/ 23 февраля 2019

Если вы хотите сопоставить 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 с необязательной повторяющейся частью, соответствующей пробелу или табуляции, и снова 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));
...