Можно ли объединить эти два регулярных выражения (совпадение и замена) в одну операцию? - PullRequest
2 голосов
/ 04 августа 2020

Я извлекаю номер версии из четырех частей из имени файла и конвертирую его в версию, совместимую с SemVer.

  1. Имя файла: MyApp v2020.8.3.1.exe
  2. SemVer: 2020.8.3-r1

Мне удалось это сделать, используя два шага:

sVersion = Regex.Match("MyApp v2020.8.3.1.exe", "[A-Za-z ]|\.[A-Za-z]").Value
oSemver = New Regex("\.(?=[^\.]+$)")
sSemVer = oSemver.Replace(sVersion, "-r")

Это дает желаемую версию, совместимую с SemVer.

Однако для ради краткости, я хотел бы объединить эти два шага в одну операцию.

Я пробовал несколько вариантов в паре вопросов и ответов, которые я нашел:

... но мне не очень повезло.

Например:

([A-Za-z ]|\.[A-Za-z])|(\.(?=[^\.]+$)) заменено на $2 дает только номер версии из четырех частей 2020.8.3.1.

Возможно ли это, учитывая ограничения, с которыми я работаю ?

- EDIT -

Мне нужен только номер версии, совместимый с SemVer, а не новое имя файла. Другими словами, мне нужно удалить все посторонние символы (в данном случае MyApp v и .exe) и заменить последний . в четырехчастном номере версии на -r.

1 Ответ

1 голос
/ 04 августа 2020

Если я понимаю, что вы хотите (а я не уверен, что понимаю)

Обновить

var input = "MyApp v2020.8.3.1.exe";
var m = Regex.Match(input, @"(\d+)\.(\d+)\.(\d+)\.(\d+)");
var result = $"{m.Groups[1]}.{m.Groups[2]}.{m.Groups[3]}-r{m.Groups[4]}";
Console.WriteLine(result);

Вывод

2020.8.3-r1

Полная демонстрация Здесь

или вы можете просто использовать (\d+\.\d+\.\d+)\.(\d+), что приведет к 2 группам

Оригинал

var input = "MyApp v2020.8.3.1.exe";
var result = Regex.Replace(input, @"(\d+)\.(\d+)\.(\d+)\.(\d+)", "$1.$2.$3-r$4");
Console.WriteLine(result);

Вывод

MyApp v2020.8.3-r1.exe

Полная демонстрация здесь

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