подразделить номер версии с регулярными выражениями - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть регулярное выражение, которое почти соответствует моим потребностям:

Я хочу разбить некоторые номера версий на разные части.Ожидаемый результат:

                      baseBranch           curBranch           curRevision
1.36.1.5                1.36                 1.36.1.             5
1.31                    <empty>              1.                  31
1.14.2.21.1.16.1.13     1.14.2.21.1.16       1.14.2.21.1.16.1.   13
1.31.34                 <no match (illegal number - always have to be pairs)>
1.31.34.2.4             <no match (illegal number - always have to be pairs)>
1.31.34.2.4.4.5         <no match (illegal number - always have to be pairs)>

выражение

/^(?<curBranch>(?<baseBranch>(?:\d+\.\d+\.)*?)?\d+\.)(?<curRevision>\d+)$/

Выражение почти делает то, что должно, но я не смог избавиться от последней точки в поле baseBranch (точка вcurBranch предназначен)

в настоящее время вывод выглядит следующим образом

                      baseBranch           curBranch           curRevision
1.36.1.5                1.36.                1.36.1.             5
1.31                    <empty>              1.                  31
1.14.2.21.1.16.1.13     1.14.2.21.1.16.      1.14.2.21.1.16.1.   13
1.31.34                 <no match (illegal number - always have to be pairs)>
1.31.34.2.4             <no match (illegal number - always have to be pairs)>
1.31.34.2.4.4.5         <no match (illegal number - always have to be pairs)>

Ссылка для онлайн-тестирования: https://regex101.com/r/0aU07q/3

Примечание:
отрицательные случаиприятно иметь - они не должны появляться в данных

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вам нужно немного изменить способ группировки снимков.Вам нужно удалить точку из группы baseBranch (конечно) и изменить базовую группу ветви на это регулярное выражение,

(?<baseBranch>\d+(?:\.\d+)+)

, которое в основном захватывает первую цифру, а затем рекурсивно ожидает данные формы \.\d+ один или несколько.

Ваше регулярное выражение после изменения становится

^(?<curBranch>(?:(?<baseBranch>\d+(?:\.\d+)+)\.)?\d+\.)(?<curRevision>\d+)$

Демо

Дайте мне знать, если это то, что вынеобходимо.И если да, то дайте мне знать, если вы хотите, чтобы я добавил объяснение к этому регулярному выражению.

Редактировать: Для заостренных отрицательных тестовых примеров

Вы можете использовать это регулярное выражениедля сопоставления ваших новых случаев, которые будут совпадать, только если группа baseBranch имеет четное число (включая 0, например, 2, 4, 6 и т. д.) чисел, разделенных точками.

^(?<curBranch>(?:(?<baseBranch>\d+\.\d+(?:(?:\.\d+){2})*)\.)?\d+\.)(?<curRevision>\d+)$

Это регулярное выражение будет соответствовать, есливесь ввод имеет четное число чисел, разделенных точкойСледовательно, они будут соответствовать,

1.36.1.5
1.31
1.14.2.21.1.16.1.13
1.31.34.2.4.4.5.6

Но они не совпадают, так как это нечетное число чисел

1.31.34
1.31.34.2.4
1.31.34.2.4.4.5

Демо для обновленного и лучшего регулярного выражения

0 голосов
/ 30 ноября 2018

Вы можете разбить строку, используя точку

и присоединиться к ней。

my @v=split /\./,$versionstr;

return if (scalar @array) <4;

подробнее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...