Я пишу 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.2.134.3.3 на самом деле является двумя номерами версий, которые не разделены, кажется мне просто безумием.
Вывод поступает из базы данных, и они не используют разделители для разделения значений. Я попросил исправить это, но мне сказали «НЕТ».
Тогда я бы сказал им ГИГО.
То есть вы говорите, что строка хранится так, как мы видим ее в вашем вопросе, внутри единственной ячейки какой-то таблицы БД? Или это объединение нескольких значений ячеек БД?
При условии, что ^\d\.\d+\.\d соответствует каждому отдельному номеру версии (в основном, что он начинается с одной цифры, за которой следует точка), возможно, вы могли бы разделить строку на совпадения (нулевой ширины) с (?<!\.|^)(?=\d\.\d+\.\d.*?). Демо. Обратите внимание: если бы номер версии мог начинаться с двух или более цифр, не было бы однозначного способа разделения, например "1.1.111.1.1".
Попробуйте (\d+[.]\d+[.](?=(\d{1,2}(?!\.)))\2)\s?(Rev|Phase|Release)?\s?(?!Patch|Delta|TBD)[a-zA-Z]*(-)?\s?(Patch\s?\d+|Delta|Lib|TBD)?regex101.com/r/BRPHul/1



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Разделить не точку, а число, соответствующее формату версии.
Отказ от ответственности: ваша строка может содержать неустранимую ошибку: невозможно отличить версию по 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, что ты использовал для его создания?
Я получаю сообщение об ошибке JSLint "M:\TriggerScripts\GA\ircDOORStoIntegrityMapping.js(675): SyntaxError: неверный квантификатор ? arRevs = DOORSVal.split(/(?<=[^.])(?=\d\. \d+\.\d+)/g);" И когда я пытаюсь запустить его в базе данных, я получаю эту ошибку «не определено: идентификатор является зарезервированным словом», строка 675 «arRevs = DOORSVal.split(/(?<=[^.])(?=\d\.\ d+\.\d+)/g);"
@AlexanderNenachev Я сделал это вручную.
@JenPann JSLint не имеет никакого отношения к этой проблеме, это другой вопрос. Вы спросили, как получить версии. Решает ли мой ответ этот ваш конкретный вопрос? Если да, не стесняйтесь принять это (флажок) и проголосовать за (стрелка вверх).
@Mr.Polywhirl, вау, круто
@JenPann задайте еще один вопрос о JSLint
Рев -4? Как это работает? Также, пожалуйста, поделитесь ожидаемым результатом