为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕慕森 2022-11-21 20:47:26
我有很多文件名,例如:libgcc1-5.2.0-r0.70413e92.rbt.xarpython3-sqlite3-3.4.3-r1.0.f25d9e76.rbt.xaru-boot-signed-pad.bin-v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57.rbt.xar我需要从中可靠地提取名称、版本和“rbt”或“norbt”。什么是最好的方法?我正在尝试正则表达式,例如:(?<fileName>.*?)-(?<version>.+).(rbt|norbt).xar问题是文件名和版本都可以有多个分号。所以我不确定是否有答案我有两个问题:提取这些价值的最佳策略是什么?我怎样才能找出哪个版本更大?预期输出是:libgcc1, 5.2.0-r0.70413e92, rbtpython3-sqlite3, 3.4.3-r1.0.f25d9e76, rbtu-boot-signed-pad.bin, v2015.10+gitAUTOINC+1b6aee73e6-r0.02df1c57, rbt
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

这将在不使用 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;

输出将是相同的。这两种方法都假设“版本”有一个-.


查看完整回答
反对 回复 2022-11-21
?
MYYA

TA贡献1868条经验 获得超4个赞

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



        }

    }



}


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号