Regex для разделения строковых значений с помощью JavaScript

Я пишу REGEX, который будет соответствовать номерам версий, и помещаю его в массив. Проблема в том, что номера версий не совпадают. После некоторых есть текст, например Rev, Phase, Release, после которого иногда бывает больше текста, например Patch 001, Delta, Lib.

REGEX, который я создал, имеет два недостатка. 1, если третья цифра имеет значение больше 9, в случае неудачи, и 2, если она не соответствует двузначной цифре после «Исправление». Как бы я это решил?

РЕГИСТРАЦИОННОЕ ВЫРАЖЕНИЕ: arDOORSValues = DOORSVal.match(/(\d{1,}[.]\d+[.]\d{1,2}?){1}\s?(Rev|Phase|Release)?\s?[a-zA-z]*(-)?\s?(Patch\s?\d+|Delta|Lib|TBD)?/g);

Тестовая строка: 4.1.04.3.5 Ред. -4.3.5 Ред. A4.3.5 Ред. A Delta4.2.134.3.3Lib4.3.5 Патч 001

Ожидаемый результат: массив значений SW. например «4.1.0,4.3.5 Rev -,4.3.5 Rev A, 4.3.5 Rev A Delta,4.2.13,4.3.3Lib,4.3.5 Патч 001»

REGEX с цветовой кодировкой и тестовая строка

(\d{1,}[.]\d+[.]\d{1,2}?){1}\s?(Rev|Phase|Release)?\s?[a-zA-z]*(-)?\s?(Patch\s?\d+|Delta|Lib|TBD) Я убрал знак вопроса после (Patch....) или кода. Но он соответствует только 4.3.5 Rev A Delta и 4.3.5 Patch 001.

(\d{1,}[.]\d+[.]\d{1,2}?){1}\s?(Rev|Phase|Release)?\s?[a-zA-z]*(-)?\s?(Patch\s?\d+|Delta|Lib|TBD)* Не соответствует двузначному значению после 4.2.13. Он соответствует только 4.2.1.

(\d{1,}[.]\d+[.]\d{1,2}?){1}\s?(Rev|Phase|Release)?\s?[a-zA-z]*(-)?\s?(Patch\s?\d+|Delta|Lib|TBD)? Не соответствует двузначной цифре в 4.2.13 и числовом тексте патча.

Рев -4? Как это работает? Также, пожалуйста, поделитесь ожидаемым результатом

mplungjan 13.09.2023 16:30

Откуда берется эта входная строка? Почему он не использует разделители между версиями? Я даже не могу на глаз разобрать отдельные версии. И тот факт, что 4.2.134.3.3 на самом деле является двумя номерами версий, которые не разделены, кажется мне просто безумием.

Good Night Nerd Pride 13.09.2023 16:35

Вывод поступает из базы данных, и они не используют разделители для разделения значений. Я попросил исправить это, но мне сказали «НЕТ».

JenPann 13.09.2023 16:37

Тогда я бы сказал им ГИГО.

CrayonViolent 13.09.2023 16:47

То есть вы говорите, что строка хранится так, как мы видим ее в вашем вопросе, внутри единственной ячейки какой-то таблицы БД? Или это объединение нескольких значений ячеек БД?

Good Night Nerd Pride 13.09.2023 17:15

При условии, что ^\d\.\d+\.\d соответствует каждому отдельному номеру версии (в основном, что он начинается с одной цифры, за которой следует точка), возможно, вы могли бы разделить строку на совпадения (нулевой ширины) с (?<!\.|^)(?=\d\.\d+\.\d.*?). Демо. Обратите внимание: если бы номер версии мог начинаться с двух или более цифр, не было бы однозначного способа разделения, например "1.1.111.1.1".

Cary Swoveland 13.09.2023 17:32

Попробуйте (\d+[.]\d+[.](?=(\d{1,2}(?!\.)))\2)\s?(Rev|Phase|Release)?\s‌​?(?!Patch|Delta|TBD)‌​[a-zA-Z]*(-)?\s?(Pat‌​ch\s?\d+|Delta|Lib|T‌​BD)?regex101.com/r/BRPHul/1

The fourth bird 13.09.2023 17:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разделить не точку, а число, соответствующее формату версии.

Отказ от ответственности: ваша строка может содержать неустранимую ошибку: невозможно отличить версию по 4.2.134.3.3. Это может быть 4.2.1 и 34.3.3 или 4.2.13 и 4.3.3. Предполагая последнее, первая часть версии должна состоять из 1 цифры.

const str = '4.1.04.3.5 Rev -4.3.5 Rev A4.3.5 Rev A Delta4.2.134.3.3Lib4.3.5 Patch 001';

const revs = str.split(/(?<=[^.])(?=\d\.\d+\.\d+)/g);

console.info(revs);

Разбивка выражения:

/         START EXPRESSION
  (?<=    START POSITIVE LOOKBEHIND
    [^.]  NOT DOT LITERAL
  )       END POSITIVE LOOKBEHIND
  (?=     START POSITIVE LOOKAHEAD
    \d    DIGIT
    \.    DOT LITERAL
    \d+   DIGIT (ONE OR MORE)
    \.    DOT LITERAL
    \d+   DIGIT (ONE OR MORE)
  )       END POSITIVE LOOKAHEAD
/         END EXPRESSION
  g       FLAGS [GLOBAL]

@Mr.Polywhirl, что ты использовал для его создания?

Alexander Nenashev 13.09.2023 17:03

Я получаю сообщение об ошибке JSLint "M:\TriggerScripts\GA\ircDOORStoIntegrityMapping.js(675): SyntaxError: неверный квантификатор ? arRevs = DOORSVal.split(/(?<=[^.])(?=\d\. \d+\.\d+)/g);" И когда я пытаюсь запустить его в базе данных, я получаю эту ошибку «не определено: идентификатор является зарезервированным словом», строка 675 «arRevs = DOORSVal.split(/(?<=[^.])(?=\d\.\ d+\.\d+)/g);"

JenPann 13.09.2023 17:11

@AlexanderNenachev Я сделал это вручную.

Mr. Polywhirl 13.09.2023 17:25

@JenPann JSLint не имеет никакого отношения к этой проблеме, это другой вопрос. Вы спросили, как получить версии. Решает ли мой ответ этот ваш конкретный вопрос? Если да, не стесняйтесь принять это (флажок) и проголосовать за (стрелка вверх).

Alexander Nenashev 13.09.2023 17:27

@Mr.Polywhirl, вау, круто

Alexander Nenashev 13.09.2023 17:27

@JenPann задайте еще один вопрос о JSLint

Alexander Nenashev 13.09.2023 17:30

Другие вопросы по теме