Как извлечь имя и версию из строки - PullRequest
1 голос
/ 01 апреля 2019

У меня много имен файлов, таких как:

libgcc1-5.2.0-r0.70413e92.rbt.xar
python3-sqlite3-3.4.3-r1.0.f25d9e76.rbt.xar
u-boot-signed-pad.bin-v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57.rbt.xar

Мне нужно надежно извлечь имя, версию и "rbt" или "norbt" из этого. Какой самый лучший способ? Я пытаюсь регулярное выражение, что-то вроде:

(?<fileName>.*?)-(?<version>.+).(rbt|norbt).xar

Проблема - имя файла и версия могут иметь несколько точек с запятой. Поэтому я не уверен, есть ли ответ, у меня есть два вопроса:

  1. Какова лучшая стратегия для извлечения таких ценностей?
  2. Как мне узнать, какая версия лучше?

Ожидаемый результат:

libgcc1, 5.2.0-r0.70413e92, rbt
python3-sqlite3, 3.4.3-r1.0.f25d9e76, rbt
u-boot-signed-pad.bin, v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57, rbt

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

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

var fileNames = new List<string>(){
    "libgcc1-5.2.0-r0.70413e92.rbt.xar",
    "python3-sqlite3-3.4.3-r1.0.f25d9e76.rbt.xar",
    "u-boot-signed-pad.bin-v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57.rbt.xar"
};
foreach(var file in fileNames){
    var spl = file.Split('-');
    string name = string.Join("-",spl.Take(spl.Length-2));
    string versionRbt = string.Join("-",spl.Skip(spl.Length-2));
    string rbtNorbt = versionRbt.IndexOf("norbt") > 0 ? "norbt" : "rbt";
    string version = versionRbt.Replace($".{rbtNorbt}.xar","");
    Console.WriteLine($"name={name};version={version};rbt={rbtNorbt}");
}

Вывод:

name=libgcc1;version=5.2.0-r0.70413e92;rbt=rbt
name=python3-sqlite3;version=3.4.3-r1.0.f25d9e76;rbt=rbt
name=u-boot-signed-pad.bin;version=v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57;rbt=rbt

Редактировать:

Или с помощью регулярных выражений:

var m = Regex.Match(file,@"^(?<fileName>.*)-(?<version>.+-.+)\.(rbt|norbt)\.xar$");
string name = m.Groups["fileName"].Value;
string version = m.Groups["version"].Value;
string rbtNorbt = m.Groups[1].Value;

Выход будет таким же.Оба подхода предполагают, что «версия» имеет один -.

0 голосов
/ 01 апреля 2019

Протестирован следующий код и отлично работает с Regex.Я использовал опцию справа налево

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication107
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = {
                                  "libgcc1-5.2.0-r0.70413e92.rbt.xar",
                                  "python3-sqlite3-3.4.3-r1.0.f25d9e76.rbt.xar",
                                  "u-boot-signed-pad.bin-v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57.rbt.xar"
                              };

            string pattern = @"(?'prefix'.+)-(?'middle'[^-][\w+\.]+-[\w+\.]+)\.(?'extension'[^\.]+).\.xar";

            foreach (string input in inputs)
            {
                Match match = Regex.Match(input, pattern, RegexOptions.RightToLeft);
                Console.WriteLine("prefix : '{0}', middle : '{1}', extension : '{2}'",
                    match.Groups["prefix"].Value,
                    match.Groups["middle"].Value,
                    match.Groups["extension"].Value
                    );
            }
            Console.ReadLine();


        }
    }


}
...