如何从字符串中提取名称和版本

How to extract name and version from 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

我需要从中可靠地提取名称、版本和 "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

这将在不使用 Regex 的情况下为您提供所需内容:

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;

输出是一样的。两种方法都假设 "version" 有一个 -.

测试了以下代码并与 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();


        }
    }


}