簡體   English   中英

從文件名中提取版本

[英]Extract version from filename

這是我的示例文件名Text_2.23.txt我已經分離了擴展名但我無法獲取版本,因此我可以稍后在代碼中使用它進行比較。 我需要得到2.23

編輯:文件名可以有多種形式,但版本總是在文件名的末尾。

string s = f1.Name.ToString(); //for the Filename
int k = s.LastIndexOf('.');
string lhs = k < 0 ? s : s.Substring(0, k), 
    rhs = k < 0 ? "" : s.Substring(k + 1);

char[] array = lhs.ToCharArray();

Array.Reverse(array);           // reverse search from right to left
for (int j = 0; j < array.Length; j++)
{   
    char letter = array[j];     //the letter I get out in the sample case is "3" 
}

使用PathVersion類:

string fileName = "Text_2.23.txt";
string fn = Path.GetFileNameWithoutExtension(fileName);
string[] parts = fn.Split('_');

Version v;
if (parts.Length > 1 && Version.TryParse(parts.Last(), out v))
{
    Console.Write("Major:{0}, Minor:{1}", v.Major, v.Minor);
}

演示

編輯:因為您已經評論過您的文件名幾乎可以是任意的,但是版本總是在最后,您只需要那個string

使用您評論的示例:

string[] fileNames = new[] { "teext_023.ext", "txtxt.x9.08.ext", "text0911.ext" };
string[] versions = fileNames
    .Select(fileName =>
        Path.GetFileNameWithoutExtension(fileName).Split('_')
            .Last()
            .Reverse()
            .TakeWhile(c => c == '.' || Char.IsDigit(c))
            .Reverse()
    ).Select(chars => new string(chars.ToArray())).ToArray();

演示

這就是我一直在尋找的解決問題的簡單方法:

                Array.Reverse(array);  
                Boolean dot = false;
                for (int j = 0; j < array.Length; j++)
                {   
                    char letter = array[j];
                    if (char.IsNumber(letter))
                    {
                        version += letter.ToString();
                    }
                    else if (letter == '.')
                    {
                        if (dot)
                        {
                            break;
                        }
                        dot = true;
                    }
               }
                version = this.Reverse(version);

                if (version.Equals(""))
                {
                    version = "0";
                }

下面是一些使用正則表達式 (Regex) 從字符串中提取版本號的通用解決方案。

正則表達式解釋(\d+\.\d+\.\d+\.\d+)

  • (開始第一個捕獲組
  • \d匹配一個數字(相當於[0-9])
  • +在一次和無限次之間匹配前一個令牌,盡可能多次,根據需要回饋(貪婪)
  • \. 匹配字符. 字面意思(區分大小寫)
  • )關閉第一個捕獲組

因此,對於通常使用格式XXXX的版本號,只需根據需要多次重復 Regex 模式,以獲得您感興趣的版本號組件的數量。

  1. 最簡單但最不靈活的解決方案是尋找您需要的確切模式。 此方法查找標准的 4 分量版本號。 要僅查找由兩部分組成的版本號,您可以將正則表達式更改為(\d+\.\d+)
/// <summary>
/// Extracts a version from the given input.
/// </summary>
/// <param name="input">
/// String that may contain a valid 4-component version in the format X.X.X.X.
/// <para>
/// e.g. 1.0.0.0 or 0.0.17.95
/// </para>
/// </param>
/// <returns>Version or null.</returns>
public string ExtractVersionNumber(string input)
{
    var regex = new Regex(@"(\d+\.\d+\.\d+\.\d+)");
    var match = regex.Match(input);
    return match.Success ? match.Value : null;
}
  1. 更靈活的解決方案是指定您是否需要版本號的構建號和修訂號組件。
/// <summary>
/// Extracts a version number from the given input.
/// </summary>
/// <param name="input">
/// String that may contain a valid version.
/// <para>
/// e.g. 1.0.0.0 or 0.0.17.95
/// </para>
/// </param>
/// <param name="requireBuild">
/// Indicates whether the build component of the version is required.
/// <para>
/// e.g. 1.0.0 or 0.0.17
/// </para>
/// </param>
/// <param name="requireRevision">
/// Indicates whether the revision component of the version is required.
/// <para>
/// e.g. 1.0.0.0 or 0.0.17.95
/// </para>
/// </param>
/// <returns>Version or null.</returns>
public string ExtractVersionNumber(string input, bool requireBuild = true, bool requireRevision = true)
{
    var pattern = @"\d+\.\d+";

    if (requireBuild)
    {
        pattern += @"\.\d+";
    }

    if (requireRevision)
    {
        pattern += @"\.\d+";
    }

    var regex = new Regex($"({pattern})");
    var match = regex.Match(input);
    return match.Success ? match.Value : null;
}
  1. 另一種靈活的方法是指定所需版本號組件的數量。
/// <summary>
/// Extracts a version from the given input.
/// </summary>
/// <param name="input">
/// String that may contain a valid version number.
/// </param>
/// <param name="componentsRequired">
/// Number of version components required. Defaults to 4.
/// <para>Valid values: 4, 3, 2.</para>
/// <para>4 components example: 1.0.0.0 or 0.1.17.95</para>
/// <para>3 components example: 1.0.0   or 0.1.17</para>
/// <para>2 components example: 1.0     or 0.1</para>
/// </param>
/// <returns>Version or null.</returns>
public string ExtractVersionNumber(string input, int componentsRequired = 4)
{
    string pattern;
    switch (componentsRequired)
    {
        case 4:
            pattern = @"(\d+\.\d+\.\d+\.\d+)";
            break;
        case 3:
            pattern = @"(\d+\.\d+\.\d+)";
            break;
        case 2:
            pattern = @"(\d+\.\d+)";
            break;
        default:
            throw new ArgumentOutOfRangeException(nameof(componentsRequired), "Valid values: 4, 3, 2");
        }

    var regex = new Regex(pattern);
    var match = regex.Match(input);
    return match.Success ? match.Value : null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM