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

时间:2019-04-01 15:33:41

标签: c# regex parsing comparison version

我有很多文件名,例如:

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 个答案:

答案 0 :(得分:1)

这将为您提供所需的内容,而无需使用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;

输出将相同。两种方法都假定“版本”有一个-

答案 1 :(得分:0)

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


        }
    }


}